Javascript 通过将角度数组与另一个数组进行比较来过滤角度数组。
在我的Angular应用程序中,我有两个正在显示的对象数组。它们都是相同类型的对象(问题)。一个是列表,一个是一组搜索结果。在我的搜索结果中,我只想显示列表中尚未显示的结果。如何从搜索结果中筛选出列表中已有的任何结果Javascript 通过将角度数组与另一个数组进行比较来过滤角度数组。,javascript,angularjs,Javascript,Angularjs,在我的Angular应用程序中,我有两个正在显示的对象数组。它们都是相同类型的对象(问题)。一个是列表,一个是一组搜索结果。在我的搜索结果中,我只想显示列表中尚未显示的结果。如何从搜索结果中筛选出列表中已有的任何结果 在伪代码中,它类似于:对于搜索结果数组的每个成员,只有在列表数组中找不到其ID时才显示它。您可以在angularJS中创建自定义过滤器。对于您的情况,您可以创建一个类似的过滤器,如下所示 var secondArrayAsMap = {}; secondArray.map(func
在伪代码中,它类似于:对于搜索结果数组的每个成员,只有在列表数组中找不到其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吗?如果是,如何使用?当你引入另一个库依赖项时,应该提到naiveO(n*m)
算法,它会导致大多数手机掉帧。我认为OP不知道如何定义过滤器,因此我只使用了一个naive示例。OP可以根据其数据结构等更改算法。