我有一个包含对象列表的列表。每个对象上都有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
数组。必须有一种更好的方法来设置它,可能通过递归。
答案 0 :(得分:1)
如果您将第一个列表的格式转换为字典,我认为应该更容易。
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']
}
这样可以使查看更容易。
答案 1 :(得分:0)
为了清楚起见,您可能希望在此处更改变量名称,但这样做可以满足您的要求:
var values = {};
angular.forEach(startingData, function(rawData) {
angular.forEach(rawData, function(value, key) {
if (angular.isUndefined(values[key])) {
values[key] = [];
}
if (values[key].indexOf(value) === -1) {
values[key].push(value);
}
})
});
var result = [];
angular.forEach(values, function(value, key) {
result.push({prop: key, val: value})
});
答案 2 :(得分:0)
您可以简单地迭代需要过滤的数据的每个键,找到每个键的相应过滤器,并根据过滤器值检查值:
get 'users_controller/show'
答案 3 :(得分:0)
尝试:
var temp2 = [], matched;
angular.forEach(temporary, function(item){
matched = true;
angular.forEach(Object.keys(item), function(key){
angular.forEach(filter, function(filter){
filter.prop == key && filter.val.indexOf(item[key]) == -1 && (matched = false);
});
});
matched && temp2.push(item);
});
console.log(temp2)
临时是对象列表,过滤器:您的过滤器