在我的Angular应用程序中,我有两个正在显示的对象数组。它们都是相同类型的对象(问题)。一个是List,一个是一组搜索结果。在我的搜索结果中,我只想显示列表中尚未显示的结果。如何从搜索结果中过滤掉列表中已有的任何结果。
在伪代码中,它将类似于:对于搜索结果数组的每个成员,只有在List数组中找不到其ID时才显示它。
答案 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特定的问题。
可以通过以下代码在SELECT Players.ID, Players.Name, Team.ID, Team.Name
FROM Players
JOIN Teams
ON Players.Team_ID = Teams.ID
时间内完成:
O(n+m)
此代码使用arrow functions和Set实例。它可以在ES5中轻松实现,使用对象作为字典并使用普通函数。