我正在尝试使用我使用的其他JSON数组条件(过滤器)来过滤JSON数组。
这是我的代码:
function filterArray(object, criteria){
return object.filter(function(obj){
for(var i=0;i<criteria.length;i++){
let criteriaEle = criteria[i];
return Object.keys(criteriaEle).forEach(function(key){
if(obj[key] == criteriaEle[key]){
return obj;
}
})
}
})
}
例如:
object = [{type:1,company:1,color:0,name:a},{type:2,company:1,color:0,name:b},{type:1,company:3,color:0,name:c},{type:4,company:1,color:0,name:d},{type:1,company:1,color:1,name:e}]
criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}]
因此,如果我将这两个数组赋予该函数,则应该返回
obj = [{{type:1,company:1,color:0,name:a},{type:1,company:1,color:1,name:e}}]
我不确定我在哪里出错了。请帮忙。
更新: 此外,我不想使用obj.type或obj.company或object.color作为参数进行搜索,因为我希望使我的代码可维护,并且如果将来添加更多条件,则不希望稍后更新它。
答案 0 :(得分:3)
const data = [{type:1,company:1,color:0,name:'a'},{type:2,company:1,color:0,name:'b'},{type:1,company:3,color:0,name:'c'},{type:4,company:1,color:0,name:'d'},{type:1,company:1,color:1,name:'e'}];
const criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}];
function checkCriteria(obj) {
return criteria.some(criterion => {
for (const key in criterion) {
if (criterion[key] !== obj[key]) {
return false;
}
}
return true;
});
}
const filtered = data.filter(checkCriteria);
console.log('Filtered array: ', filtered);
&#13;
这是一个解决方案。
以下是一些参考资料
根据评论,添加另一个片段来解释闭包的概念。
const data = [{type:1,company:1,color:0,name:'a'},{type:2,company:1,color:0,name:'b'},{type:1,company:3,color:0,name:'c'},{type:4,company:1,color:0,name:'d'},{type:1,company:1,color:1,name:'e'}];
function createCriteriaValidationFunction(criteria) {
return function checkCriteria(obj) {
return criteria.some(criterion => {
for (const key in criterion) {
if (criterion[key] !== obj[key]) {
return false;
}
}
return true;
});
}
}
const criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}];
const filtered = data.filter(createCriteriaValidationFunction(criteria));
console.log('Filtered array: ', filtered);
&#13;
它与以前的概念相同,但是,标准是在文件中定义的。这一次,标准可以在外部定义,并可以传递给函数。诀窍是动态创建checkCriteria函数,传递条件并在闭包中可用。在这两种情况下,条件变量都在执行checkCriteria的范围内可用。