2017-04-21 37 views
0

我有一個我想要使用_.difference過濾的用戶列表。但它不能用於比較對象。它只適用於我只比較用戶名。這裏是代碼片段:下劃線差異不適用於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 

任何想法?謝謝 - C.

注:這樣做是爲followss的替代方式,但不知道的效率:

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

回答

2

這些對象的數組,其僅視爲引用(如地址) 。由於它們不是相同對象實例的引用(即使它們包含相同的信息),它們被認爲是完全不同的。

_.difference不會對數組內容進行深入檢查,它只是查看值並看到它們是對象引用。

如果你想要的對象

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

非常感謝! – Christian68

+0

@ Christian68如果這對你有幫助,你應該接受它來標記問題已經解決。 –