Angularjs中对象数组之间的差异

时间:2015-12-26 11:40:06

标签: javascript angularjs lodash

我正在使用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

1 个答案:

答案 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的结果相连。