比较两个包含对象的数组

Bat*_*man 10 javascript arrays jquery angularjs

我有两个数组,只包含组的对象.一个包含我网站上的所有组.另一个包含特定用户所属的所有组.

我想减去:All the groups- user groups =groups remaining

我正在使用AngularJS,我不确定这里是否有帮助(可能会使用过滤器).

我查看了之前的问题并遇到了一些选择:

这些是我试过的:

$scope.availableGroups =  $($scope.groups).not($scope.assignedGroups).get();
$scope.availableGroups = $.grep($scope.groups,function(x) {return $.inArray(x, $scope.assignedGroups) < 0})
Run Code Online (Sandbox Code Playgroud)

这是一个数组:

assignedGroups:

[{
    id: 115,
    name: 'Test Group 2',
    Description: '',
    owner: 10,
    OwnerIsUser: false,
}, {
    id: 116,
    name: 'Test Group 3',
    Description: '',
    owner: 71,
    OwnerIsUser: false,
}, {
    id: 117,
    name: 'Test Group 4',
    Description: '',
    owner: 71,
    OwnerIsUser: false,
}, {
    id: 118,
    name: 'Test Group 5',
    Description: '',
    owner: 115,
    OwnerIsUser: false,
}, {
    id: 119,
    name: 'Test Group 6',
    Description: '',
    owner: 8,
    OwnerIsUser: true,
}];
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyn 8

我认为你应该首先将id提取到一个对象然后比较两个对象.例如:

var assignedGroupsIds = {};
var groupsIds = {};
var result = [];

$scope.assignedGroups.forEach(function (el, i) {
  assignedGroupsIds[el.id] = $scope.assignedGroups[i];
});

$scope.groups.forEach(function (el, i) {
  groupsIds[el.id] = $scope.groups[i];
});

for (var i in groupsIds) {
    if (!assignedGroupsIds.hasOwnProperty(i)) {
        result.push(groupsIds[i]);
    }
}

return result;
Run Code Online (Sandbox Code Playgroud)

这里简化了小提琴:http://jsfiddle.net/NLQGL/2/ 根据您的需要调整它.

我认为这是一个很好的解决方案,因为你可以重用该groupsIds对象(它似乎不经常改变).

注意:请随意使用angular.forEach()而不是Array.prototype.forEach