JS基于两个数组与嵌套元素的比较返回数组

时间:2015-07-01 07:23:00

标签: javascript arrays angularjs filter

使用Angular并尝试根据两个数组的比较返回结果。这就是我所拥有的:

$scope.fbFriends = [{"id":1234,"name":'bob'},
                    {"id":4567,"name":'john'}, 
                    {"id":8910,"name":'totoro'}];
$scope.appFriends = [{"id":1,"name":'bob',"fb_id":1234},          
                     {"id":2,"name":'john',"fb_id":4567}];

我想过滤两者中存在的朋友,只返回appFriends中不存在的fbFriends中的朋友。 这就是我所做的,但它不起作用,它返回方式太多次了。

$scope.not_friends = [];
        $scope.filtered = [];
        for (var i=0; i < $scope.fbFriends.length; i++) {
           for (var j=0; j < $scope.appFriends.length; j++) {
             if ($scope.fbFriends[i].id !== $scope.appFriends[j].fb_id) {
               $scope.not_friends = $scope.fbFriends[i];
               $scope.filtered.push($scope.not_friends);
             }
           }
        };
        console.log($scope.filtered);

这种方法有什么问题? 奖金,我可以将其整合到过滤器中并在fbFriends的ng-repeat中使用它吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

问题是$baseDir:您必须检查是否相等然后 - 因为您正在搜索未包含在fbFriends中的朋友 - 请删除该对象。

我已经重写了您的代码,它似乎正常运行。

if block

有关进一步参考,请参阅算法手册(我的建议是Introduction to Algorithms,Thomas H. Cormen,但任何人都会这样做。)

答案 1 :(得分:0)

这是一个通用的集合差异操作

difference = function(a, b, eq) {
  return a.filter(function(x) {
    return b.every(function(y) {
      return !eq(x, y)
    });
  });
}

其中a, b是数组,eq - 相等函数。

这就是如何将它应用于您的问题:

fbFriends = [{"id":1234,"name":'bob'},
                    {"id":4567,"name":'john'}, 
                    {"id":8910,"name":'totoro'}];
appFriends = [{"id":1,"name":'bob',"fb_id":1234},          
                     {"id":2,"name":'john',"fb_id":4567}];


difference = function(a, b, eq) {
  return a.filter(function(x) {
    return b.every(function(y) {
      return !eq(x, y)
    });
  });
}

onlyFb = difference(fbFriends, appFriends, function(f, a) {
  return f.id === a.fb_id
});

document.write(JSON.stringify(onlyFb))