2016-07-06 9 views
0

Ich habe versucht, lodash (4.13.1) _.differenceBy zu verwenden, und ich muss etwas verpassen.Lodash DifferenceBy verhält sich nicht wie excepted

ich eine Geige hier haben: http://jsfiddle.net/cmwye4z1/2/

Hier ist das javascript:

$scope.files_a = [ 
    {'name': 'file1.wav', 'size': 989010, 'duration': 44.953, 'temp': 1}, 
    {'name': 'file2.wav', 'size': 326984, 'duration': 14.860, 'temp': 1}, 
    {'name': 'file3.wav', 'size': 584723, 'duration': 28.583, 'temp': 1}, 
    {'name': 'file4.wav', 'size': 483829, 'duration': 22.859, 'temp': 1}, 
    {'name': 'file5.wav', 'size': 283949, 'duration': 9.495, 'temp': 1}, 
    {'name': 'file6.wav', 'size': 839372, 'duration': 38.584, 'temp': 1}, 
    {'name': 'file7.wav', 'size': 784949, 'duration': 29.594, 'temp': 1} 
]; 

$scope.files_b = [ 
    {'name': 'file8.wav', 'size': 989010, 'duration': 44.953, 'temp': 'auto'}, 
    {'name': 'file2.wav', 'size': 326984, 'duration': 14.860, 'temp': 1} 
]; 

$scope.differenceBy = _.differenceBy($scope.files_a, $scope.files_b, ['name', 'size', 'duration']); 

Und was erwartete ich war:

$scope.differenceBy = [ 
    {'name': 'file1.wav', 'size': 989010, 'duration': 44.953, 'temp': 1}, 
    {'name': 'file3.wav', 'size': 584723, 'duration': 28.583, 'temp': 1}, 
    {'name': 'file4.wav', 'size': 483829, 'duration': 22.859, 'temp': 1}, 
    {'name': 'file5.wav', 'size': 283949, 'duration': 9.495, 'temp': 1}, 
    {'name': 'file6.wav', 'size': 839372, 'duration': 38.584, 'temp': 1}, 
    {'name': 'file7.wav', 'size': 784949, 'duration': 29.594, 'temp': 1} 
]; 

Mit file2.wav entfernt, aber was ich get ist nur $ scope.files_a.

Wenn ich die Klammern entfernen, dann bekomme ich file3, file4, file5, file6 und file7.

Wenn ich die Dokumentation richtig verstehe, kann der iteratee ein Array sein, aber vielleicht irre ich mich? Kann mir bitte jemand klarstellen?

+0

Mein Anwendungsfall ist, dass ich mit einer großen Anzahl von Dateien zu tun habe und manchmal die Dateinamen identisch sein können, obwohl die Datei selbst unterschiedlich ist und ich zwischen Dateien unterscheiden kann, die identisch sein können oder nicht . – JulieMarie

+0

Es ist schwer zu verstehen, was sie in der Dokumentation meinen, und deine Geige ist ebenso mysteriös. Meine (zugegebenermaßen faule) Herangehensweise wäre es, dem iteratee eine Funktion zu geben, die den Namen concat'd mit der Größe in Bytes (als String) zurückgibt. – danh

Antwort

0

Mein Kommentar, in anderen Worten, entweder von jemand schlauer über eine Antwort zu warten, wie differenceBy funktioniert wirklich mit einem Array Argument oder die Verwendung ...

$scope.differenceBy = _.differenceBy($scope.files_a, $scope.files_b, function(obj) { 
    return obj.name + obj.size; 
}); 

, die korrekt zu funktionieren scheint Ihre Geige.

+0

Das funktioniert und ich hätte nie gedacht, so etwas zu tun. Ich werde warten, um zu sehen, ob irgendjemand antwortet, wie es funktionieren soll, seit ich mystifiziert worden bin, aber danke Dan! – JulieMarie

+0

Dies ... https://leanpub.com/lodashcookbook/read#leanpub-auto-v4-iteratee-shorthand ... scheint darauf hinzuweisen, dass in v4 ein Zwei-Elemente-Array '[key, value]' eine Abkürzung für '_.matchesProperty (Objekt [Schlüssel], Wert)'. Ich denke, im Unterschied, ein solcher iteratee würde über beide Arrays abbilden, und Sie würden den Unterschied basierend auf den resultierenden booleans nehmen. In Ihrem Fall hat keine der 'name'-Eigenschaften den Wert' size ', also wären sie alle falsch und daher alle übereinstimmend. All dies wird jedoch in Experimenten mit deiner Geige nicht ganz bestätigt. – danh

+0

Hmmm, du hast Recht. Ich fange an zu denken, dass ich vielleicht nicht tun kann, was ich dachte, ich könnte. Ich habe versucht, mehrere Schlüssel zwischen den zwei Arrays zu vergleichen, aber das ist vielleicht nicht möglich, das Kochbuch anzuschauen. – JulieMarie