2015-07-01 45 views
0

使用Angular並嘗試返回基於兩個數組的比較結果。以下是我有:JS基於兩個數組與嵌套元素的比較返回數組

$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?

謝謝!

+0

對於初學者'$ scope.not_friends = $ scope.fbFriends [I]':我想你想在這裏推這個物品? – Johan

+0

你應該首先提取一個你需要比較的基元對象,可能是'fb_id'。這樣,你不必循環一個循環(n^2),你可以做得更像(n * 2) – dandavis

+0

是的,最後我只返回那些在視圖中都是的。獲取fb id列表進行比較是很好的,但是我需要從數組中提取只有那些不匹配的數據。這不是讓更多的代碼? – commandantp

回答

0

問題是if block:您必須檢查是否相等,然後 - 因爲您正在搜索fbFriends中未包含的朋友 - 請移除該對象。

我重寫了你的代碼,它似乎正常工作。

$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}]; 

     for (var i=0; i < $scope.appFriends.length; i++) { 
     // we parse the 'reference array' 
     for (var j=0; j < $scope.fbFriends.length; j++) { 
      // we check every value inside the 'container array' 
      if ($scope.fbFriends[j].id == $scope.appFriends[i].fb_id) { 

      // the element is alredy inside the appFriends 

      $scope.fbFriends.splice(j,1); 
      } 
     } 
     } 

     console.log($scope.fbFriends); 

有關進一步的參考看到一個算法的書(我的建議是Introduction to Algorithms由托馬斯·H·科門,但任何人會做。)

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))

+0

這看起來非常好!讓我試着去實現它!你認爲我可以從我的控制器中取出差異功能並創建一個過濾器嗎? – commandantp