2017-04-21 1 views
0

Ich habe eine Liste von Benutzern, die ich filtern möchte, mit _.difference. Aber es funktioniert nicht beim Vergleichen der Objekte. Es funktioniert nur, wenn ich nur die Benutzernamen vergleiche. Hier ist das Code-Schnipsel:Underscore Unterschied funktioniert nicht auf Array von JSON-Objekten

var users = [ 
     { 
     "username": "user1", 
     "birthdate": "birth1" 
     }, 
     { 
     "username": "user2", 
     "birthdate": "birth2" 
     }, 
     { 
     "username": "user3", 
     "birthdate": "birth3" 
     }, 
     { 
     "username": "user4", 
     "birthdate": "birth4" 
     } 
    ]; 

    var keep = [ 
     { 
     "username": "user1", 
     "birthdate": "birth1" 
     }, 
     { 
     "username": "user3", 
     "birthdate": "birth3" 
     } 
    ]; 

    log(_.difference(_.pluck(users,"username"),_.pluck(keep,"username"))); // works 
    log(_.difference(users,keep)); // this is what I want, does not work 

Irgendwelche Idee? Dank - C.

Hinweis: eine alternative Möglichkeit, es zu tun, wie followss ist, aber nicht sicher über die Effizienz:

 log(_.filter(users, function(num){ 
     return (!_.contains(_.pluck(keep,"username"),num.username)) 
    })); 

Antwort

2

Dies sind Arrays von Objekten, die nur als Referenz zu sehen sind (wie Adressen) . Da es sich nicht um Referenzen derselben Objektinstanzen handelt (auch wenn sie dieselben Informationen enthalten), werden sie alle als unterschiedlich betrachtet.

_.difference macht keine tiefgehende Inspektion des Arrays Inhalt, es sieht nur die Werte und sieht, dass sie Objektreferenzen sind.

Wenn Sie die Objekte wollen

var users = [{ "username": "user1", "birthdate": "birth1" }, { "username": "user2", "birthdate": "birth2" }, { "username": "user3", "birthdate": "birth3" }, { "username": "user4", "birthdate": "birth4" }]; 
 
var keep = [{ "username": "user1", "birthdate": "birth1" }, { "username": "user3", "birthdate": "birth3" }]; 
 

 
// if you want to compare all the properties 
 
var result = _.reject(users, _.partial(_.findWhere, keep, _)); 
 

 
console.log("All attributes", result); 
 

 
// if the username is the identifying field 
 
var keepUsernames = _.pluck(keep, 'username'); 
 
result = _.reject(users, (user) => _.indexOf(keepUsernames, user.username) > -1); 
 

 
console.log("usernames", result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

+0

Vielen Dank! – Christian68

+0

@ Christian68 Wenn Ihnen das hilft, sollten Sie es akzeptieren, um die Frage als gelöst zu markieren. –

Verwandte Themen