2017-04-21 1 views
0

J'ai une liste d'utilisateurs que je veux filtrer, en utilisant _.difference. Mais cela ne marche pas sur la comparaison des objets. Cela ne fonctionne que si je ne compare que les noms d'utilisateur. Voici l'extrait de code:La différence soulignée ne fonctionne pas sur le tableau d'objets JSON

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 

Une idée? Merci - C.

Note: une autre façon de le faire est aussi followss, mais pas sûr de l'efficacité:

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

Répondre

2

Ce sont des tableaux d'objets, qui ne sont considérés comme des références (comme les adresses) . Comme ils ne sont pas des références des mêmes instances d'objet (même s'ils contiennent la même information), ils sont considérés comme tous différents.

_.difference_.difference_.difference ne fait pas une inspection approfondie du contenu des tableaux, il regarde juste les valeurs et voit qu'ils sont des références d'objet.

Si vous voulez que les objets

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

Merci beaucoup! – Christian68

+0

@ Christian68 Si cela vous a aidé, vous devriez l'accepter pour marquer la question comme résolue. –