Angularjs中对象数组之间的差异

Difference between array of objects in Angularjs

本文关键字:之间 数组 对象 Angularjs      更新时间:2023-09-26

我使用的是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;
  }

然而,我没有得到正确的结果,也不确定我搞砸了什么。新方法返回某些组的assignedUsers列表中的availableUsers。第一次运行时,它似乎很有效,但如果我不断改变我所关注的组,结果就会全部消失,无法相加。

我在这里找到了这个方法。

在第一个例子中,您使用的是Array.push,无论您多么频繁地调用compareUsers,它总是在累加(显然)。

在第二个示例中,每次使用_.filter 的结果调用compareUsers时,都会覆盖availableUsers

我建议不要这样做:

availableUsers = _.filter(allUsers, function(user){
    return !_.findWhere(assignedUsers, user);
});

你知道:

availableUsers = availableUsers.concat(_.filter(allUsers, function(user){
    return !_.findWhere(assignedUsers, user);
}));

这应该行得通。它将用_.filter的结果来连接availableUsers数组。