【问题标题】:Filter JSON array by values included in two arrays (javascript)按两个数组中包含的值过滤 JSON 数组(javascript)
【发布时间】:2018-09-23 16:16:56
【问题描述】:

我正在编写一个基于多个条件的 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",
}]

【问题讨论】:

  • searchKeys 是 JSON 键的数组,其中包含搜索的值。
  • 似乎工作正常。你想要什么输出。它正在返回 varSpec: "trip" varTrans: "pret" varWord: "greet" stringPol: "group" stringDva: "groupGend" stringGit: "/tax"
  • 哦,是的,你是对的!感谢您抽出宝贵时间,我的问题出在代码的不同部分。

标签: javascript json node.js filter lodash


【解决方案1】:

你可以选择这个非常简单的算法:

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
  )
);

它基本上归结为首先检查数据集 (data) 的每个条目中的相关值(由 searchKeys 标识)之间的 交集,然后另一个:

  1. obligatory 值数组:交集的长度必须为 obligatory.length
    :它包含 所有来自 obligatory 的项目收藏
  2. optional 值数组:交集数组的长度必须为 >= 1
    :它包含 至少 1 项来自 @987654330 @收藏

这是working repl的链接。

【讨论】:

  • 谢谢你,非常感谢你的帮助和提供的例子。试试看。
猜你喜欢
  • 2021-08-28
  • 2021-12-11
  • 2021-03-17
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多