我有一个包含对象列表的列表。每个对象都有 4 个属性。有一个复选框列表,其中包含两个属性的唯一值,这有助于构建我的过滤器数组。
过滤器最终可能看起来像这样:
[
{
prop: 'username',
val: ['max', 'sam']
},
{
prop: 'color',
val: ['blue', 'green']
}
]
对象列表看起来像这样:
[
{
username: 'sam',
color: 'blue'
},
{
username: 'jimmy',
color: 'blue'
},
{
username: 'sam',
color: 'black'
},
{
username: 'max',
color: 'green'
},
{
username: 'max',
color: 'blue'
}
]
期望的结果
[
{
username: 'sam',
color: 'blue'
},
{
username: 'max',
color: 'green'
},
{
username: 'max',
color: 'blue'
}
]
<小时/>
我感觉自己正陷入一个永无止境的forEach
兔子洞。我猜我需要某种递归。目前,这是我所拥有的:
var temporary = scope.transactions;
function getFilteredTransactions() {
var filter = deviceFilterService.get();
if (filter.length > 0) {
var temp2 = [];
angular.forEach(filter, function (fil) {
//object
angular.forEach(fil.val, function (filterValue) {
//list on each object
angular.forEach(temporary, function (transaction) {
if (transaction[fil.prop] === filterValue) {
if (temp2.indexOf(transaction) === -1) {
temp2.push(transaction);
}
}
});
temporary = temp2;
});
});
$log.debug(temporary);
scope.transactions = temporary;
} else {
initialize();
}
}
这开始起作用,第二次遍历 color
属性时,它最终只想将完全相同的事务添加到 temp2
数组中。必须有更好的方法来设置它,可能通过递归。
最佳答案
如果您将第一个列表的格式转换为字典,我认为应该会变得更容易。
var dict = {};
angular.forEach(source1, function(ob){
dict[ob.prop] = ob.val;
});
function getFiltered(ob){
for(var prop in ob){
if(dict[prop] && dict[prop].indexOf(ob[prop]) === -1){
return false;
}
}
return true;
};
并将其命名为:
var temporary = scope.transactions.filter(getFiltered);
<强> Demo
<小时/>基本上第一部分转换:
[
{
prop: 'username',
val: ['max', 'sam']
},
{
prop: 'color',
val: ['blue', 'green']
}
];
至:
{
username:['max', 'sam'],
color:['blue', 'green']
}
这样查找起来就容易多了。
关于javascript - 基于另一个数组的过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518870/