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

标签 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",
}]

最佳答案

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

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),另一方面:

  1. 强制值数组:交集必须是obligatory.length长度。
    :它包含所有来自强制性集合的项目
  2. 值的可选数组:交集数组的长度必须是>= 1
    :它包含来自可选集合的至少 1

这是一个指向 working repl 的链接.

关于javascript - 按两个数组中包含的值过滤 JSON 数组 (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52467989/

相关文章:

javascript - 如何在 javascript 中验证和限制数字数据的 asp.net 文本框控件的长度?

javascript - 使用 jQuery 进行 JSON 树搜索,错误

node.js - 运行 mocha 测试时 Babel 意外 token 导入

javascript - react 私有(private)路由无限渲染 - 获取错误错误 : Maximum update depth exceeded

javascript - 如何拦截 puppeteer 上的下载请求并读取被拦截的文件

javascript - "Date"是 JavaScript 中的数据类型吗?

json - 如何根据数组中的值在JQ中选择项目

java - 漂亮地打印字符串到 JSON 格式

javascript - node js 中的 module.exports 是否创建导出对象或函数的浅拷贝或深拷贝?

node.js - Dynamoose 中 Schema.Types.ObjectId 的等效项