我正在使用Angular。我试图比较两个对象数组 我能够让它像这样工作:
var compareUsers = function () {
//Comparing assigned groups with all to return available users
var assignedUsersIds = {};
var usersIds = {};
availableUsers = []; //declared higher up, populated with user objects on load
//assignedUsers, declaired higher up, populated by function calling compareUsers
assignedUsers.forEach(function (el, i) {
assignedUsersIds[el.id] = assignedUsers[i];
});
allUsers.forEach(function (el, i) {
usersIds[el.id] = allUsers[i];
});
for (var i in usersIds) {
if (!assignedUsersIds.hasOwnProperty(i)) {
availableUsers.push(usersIds[i]);
}
};
console.log(availableUsers);
return availableUsers;
}
我发现了一种更好的方法,所以我使用lodash
重构了它:
var compareUsers = function () {
availableUsers = _.filter(allUsers, function(user){
return !_.findWhere(assignedUsers, user);
});
console.info(availableUsers);
return availableUsers;
}
然而,我没有得到正确的结果,也不确定我搞砸了什么。新方法返回availableUsers
,它们位于某些组的assignedUsers
列表中。它第一次运行时似乎有效,但如果我不断改变哪个组,我看着结果都是关闭的,不要加起来。
我找到了这种方法here。
答案 0 :(得分:1)
在第一个示例中,您使用的是Array.push
,无论您多久拨打一次compareUsers
,它总是会加起来(显然)。
在第二个示例中,每次拨打availableUsers
时,您都会覆盖compareUsers
,结果为_.filter
我建议不要这样做:
availableUsers = _.filter(allUsers, function(user){
return !_.findWhere(assignedUsers, user);
});
你这样做:
availableUsers = availableUsers.concat(_.filter(allUsers, function(user){
return !_.findWhere(assignedUsers, user);
}));
这应该有效。它会使availableUsers
数组与_.filter
的结果相连。