按两个数组中包含的值过滤JSON数组(javascript)

时间:2018-09-23 16:16:57

标签: javascript json node.js filter lodash

我正在基于多个条件编写JSON数组过滤器功能。
过滤器取决于两个数组: 1.第一个包含必须是搜索JSON一部分的值,并且 2.第二个包含可选值。

我的意思是只返回包含obligatory数组的所有值和optional数组的至少一项的数组条目。

这是我的尝试:

const searchKeys = ['varWord', 'varTrans', 'varSpec'],
  obligatory = ['trip', 'pret'],
  optional = ['greet', 'lco', 'toto', 'bene'];

function filterByUpdate(obligatory, optional, file) {
  return _.filter(file, item => {
    return _.some(optional, opt => {
      return _.every(obligatory, oblg => {
        return _.some(item, value => {
          return _.some(searchKeys, n => item[n].toLowerCase().includes(oblg.toLowerCase())) &&
            searchKeys.some(n => item[n].toLowerCase().includes(opt.toLowerCase()))
        })
      });
    });
  });
}

上面的代码应仅保留以下数据数组中的第一个条目:

[{
  "varSpec": "trip",
  "varTrans": "pret",
  "varWord": "greet",
  "stringPol": "group",
  "stringDva": "groupGend",
  "stringGit": "/tax",
}, {
  "varSpec": "trip",
  "varTrans": "pret",
  "varWord": "friend",
  "stringPol": "N",
  "stringDva": "N",
  "stringGit": "N",
}, {
  "varSpec": "group1",
  "varTrans": "grp1",
  "varWord": "ageGroup1",
  "stringPol": "N",
  "stringDva": "N",
  "stringGit": "N",
}]

1 个答案:

答案 0 :(得分:2)

您可以使用这个非常简单的算法:

const { flow, intersection, pick } = require('lodash/fp');

data.filter(
  flow(
    pick(searchKeys),
    entry => intersection(Object.values(entry)),
    intersectWith => intersectWith(obligatory).length === obligatory.length &&
                     intersectWith(optional).length >= 1
  )
);

基本上,首先要检查数据集的每个条目(searchKeys中的相关值(由data标识)之间的交点 ),另一方面:

  1. obligatory的数组:交点的长度必须为obligatory.length
    :它包含来自obligatory集合的所有项目
  2. optional的数组:相交数组的长度必须为>= 1
    :它包含来自optional集合的至少1 个项目

这是指向working repl的链接。