几个小时后,我遇到了麻烦-想知道一个刚入门的开发人员是否可以查看以下内容,简化代码以显示问题。
我正在过滤对象数组上的属性值,并将该属性与具有匹配键和布尔值的数组进行交叉引用,以控制是否应将其分解为过滤器。
尽管console.log似乎可以正确评估,但我的结果是返回了所有3个对象。有什么想法吗?
非常感谢...
var data = [{
"id": 1,
"status": "new",
},
{
"id": 2,
"status": "rejected",
},
{
"id": 3,
"status": "changed",
}
];
var filter = {
"new": true,
"rejected": false,
"changed": true
}
var result = data.filter(function(item) {
var arr = [];
Object.keys(filter).forEach(function(key) {
if (item.status === key && filter[key] === true) {
console.log('---')
console.log('item.status', item.status)
console.log('key', key)
console.log('filter[key]', filter[key])
console.log('---')
arr.push(item);
}
});
return arr;
});
答案 0 :(得分:2)
您filter
通过直接返回真实或错误的内容,而不是通过返回更具体的内容(例如对象)来返回。您可以将代码简化为单一代码:
var data=[{"id":1,"status":"new",},{"id":2,"status":"rejected",},{"id":3,"status":"changed",}]
var filter = {
"new": true,
"rejected": false,
"changed": true
}
var result = data.filter((item) => filter[item.status])
console.log(result);
答案 1 :(得分:2)
您正在使此操作变得比您需要的复杂。传递给filter()
的函数应该返回一个布尔值-您正在返回一个数组。
您可以简单地在filter
数组上进行查找过滤,该数组将返回false
或undefined
,在这种情况下您可以将其过滤掉,或者返回true
,在这种情况下,请保留它。.
var data = [{
"id": 1,
"status": "new",
},
{
"id": 2,
"status": "rejected",
},
{
"id": 3,
"status": "changed",
}
];
var filter = {
"new": true,
"rejected": false,
"changed": true
}
var result = data.filter(item => filter[item.status])
console.log(result)
答案 2 :(得分:2)
filter
将使用每个返回真实值的item
创建一个新数组。这应该起作用:
var result = data.filter(function(item) {
return filter[item.status];
});