使用另一个JSON数组节点js搜索JSON数组

时间:2017-10-04 02:37:49

标签: arrays node.js

我正在尝试使用我使用的其他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作为参数进行搜索,因为我希望使我的代码可维护,并且如果将来添加更多条件,则不希望稍后更新它。

1 个答案:

答案 0 :(得分:3)

&#13;
&#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'}];

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;
&#13;
&#13;

这是一个解决方案。

以下是一些参考资料

Array.some Array.filter

根据评论,添加另一个片段来解释闭包的概念。

&#13;
&#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;
&#13;
&#13;

它与以前的概念相同,但是,标准是在文件中定义的。这一次,标准可以在外部定义,并可以传递给函数。诀窍是动态创建checkCriteria函数,传递条件并在闭包中可用。在这两种情况下,条件变量都在执行checkCriteria的范围内可用。