Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过将角度数组与另一个数组进行比较来过滤角度数组。_Javascript_Angularjs - Fatal编程技术网

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

Javascript 通过将角度数组与另一个数组进行比较来过滤角度数组。,javascript,angularjs,Javascript,Angularjs,在我的Angular应用程序中,我有两个正在显示的对象数组。它们都是相同类型的对象(问题)。一个是列表,一个是一组搜索结果。在我的搜索结果中,我只想显示列表中尚未显示的结果。如何从搜索结果中筛选出列表中已有的任何结果 在伪代码中,它类似于:对于搜索结果数组的每个成员,只有在列表数组中找不到其ID时才显示它。您可以在angularJS中创建自定义过滤器。对于您的情况,您可以创建一个类似的过滤器,如下所示 var secondArrayAsMap = {}; secondArray.map(func

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


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

您可以在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>
。。。

这应该在数组中循环,比较一些值,如果值不在这两个数组中,我们将其添加到一个新数组中,然后您可以将其带回并添加到要在视图中显示的$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];
   }
}
$scope.data\u搜索后=//您的数据
$scope.data=//您的数据
$scope.newArray=[];
对于(i=0;i
这只是一个基本的例子,但它应该有效。
我使用了.name,因为我不知道您有哪些类型的数据,但您可能应该使用id,因为如果两个对象具有相同的id,它们也应该具有相同的数据。

您可以使用高阶函数和.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);

不是完整答案,因为它没有涵盖具体的问题

事实上,您正在寻找集合减法

可通过以下代码在
O(n+m)
时间内完成:

// returns all elements from arr1, that doesn't have matching ID in arr2
function except(arr1, arr2, propertyName='ID') {
    let exceptIds = new Set(arr2.map(el=>el[propertyName])); // get set of all IDs in array2
    return arr1.filter(el=>!exceptIds.has(el[propertyName]));
}

这段代码使用和实例。在ES5中,使用对象作为字典并使用普通函数可以很容易地实现它。

您对伪代码的哪一部分有困难?看起来你需要一个
,然后是
的indexOf
(原语)或者一个嵌套的
(对象)。你能展示你尝试过的代码吗?我对JS和Angular都不熟悉。这在Ruby中是微不足道的,但我想在前端实现,不知道最佳实践。我应该使用ng if还是ng show?过滤搜索结果的最佳方式是什么。我应该使用$filter吗?如果是,如何使用?当你引入另一个库依赖项时,应该提到naive
O(n*m)
算法,它会导致大多数手机掉帧。我认为OP不知道如何定义过滤器,因此我只使用了一个naive示例。OP可以根据其数据结构等更改算法。