2017-04-21 7 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이 도움이된다면 문제를 해결 된 것으로 표시하려면 동의해야합니다. –