通过与另一个数组进行比较来过滤角度数组。

时间:2015-08-10 13:48:25

标签: javascript angularjs

在我的Angular应用程序中,我有两个正在显示的对象数组。它们都是相同类型的对象(问题)。一个是List,一个是一组搜索结果。在我的搜索结果中,我只想显示列表中尚未显示的结果。如何从搜索结果中过滤掉列表中已有的任何结果。

在伪代码中,它将类似于:对于搜索结果数组的每个成员,只有在List数组中找不到其ID时才显示它。

4 个答案:

答案 0 :(得分:1)

您可以在angularJS中创建自定义过滤器。对于您的情况,您可以创建类似于下面的过滤器。

var secondArrayAsMap = {};
secondArray.map(function (elementInSecondArray) {
    secondArrayAsMap[elementInSecondArray] = elementInSecondArray;
})
return firstArray.filter(function (elementInFirstArray) {
     return secondArrayAsMap[elementInFirstArray] !== undefined;
});

在您的HTML中,您可以直接访问此过滤器,如下所示:

<div ng-repeat=item in filteredItems = (firstArray | yourFilterName:secondArray)>...</div>

答案 1 :(得分:0)

这应该循环遍历数组,比较一些值,如果值不是,我们将它添加到一个新的数组,然后你可以带回来并添加到你的视图中显示的$ scope。

在您的控制器中

$scope.data_after_search = //your data
$scope.data = //your data

$scope.newArray = [];

for (i = 0; i < data_after_search.length; i++) 
{
   if ($scope.data_after_search.name != $scope.data.name) {
      //some code
      $scope.newArray += $scope.data_after_search[i];
   }
}

这只是一个基本的例子,但应该有效。 我使用.name是因为我不知道你有什么类型的数据,但是你应该使用id,因为如果2个具有相同的id,它们也应该具有相同的数据。

答案 2 :(得分:0)

您可以使用高阶功能 .filter()方法来处理您的数据。

使用功能方法是一个非常好的选择,使您的代码更清洁和可重用。因此,您可以创建一个函数生成器,并将其传递给 .filter 方法:

    var search = [{
      id: 1,
      name:'toto'
    }, {
      id: 2,
      name:'titi'
    }, {
      id: 3,
      name: 'tata'
    }, {
      id: 4,
      name: 'john'
    }];

    var list = [{
      id:1,
      name:'toto'
    }, {
      id: 3,
      name: 'tata'
    }];

  //Create a function generator to filter our array
  function filterBy(key, filter){
    return function(elm){
      return filter.indexOf(elm[key]) === -1;
    }
  }

  //Use .filter method, by applying high order function and map the list id
  var filtered = search.filter( filterBy('id', list.map(function(e){return e.id}) ) );

  console.log(filtered);

答案 3 :(得分:0)

不完整答案,因为它没有涵盖Angular特定的问题。

事实上,您正在寻找set substraction。set operations

可以通过以下代码在SELECT Players.ID, Players.Name, Team.ID, Team.Name FROM Players JOIN Teams ON Players.Team_ID = Teams.ID 时间内完成:

O(n+m)

此代码使用arrow functionsSet实例。它可以在ES5中轻松实现,使用对象作为字典并使用普通函数。