按两个数组中包含的值筛选JSON数组(javascript)
我正在编写一个基于多个条件的JSON数组过滤器函数。按两个数组中包含的值筛选JSON数组(javascript),javascript,json,node.js,filter,lodash,Javascript,Json,Node.js,Filter,Lodash,我正在编写一个基于多个条件的JSON数组过滤器函数。 过滤器取决于两个阵列: 1.第一个包含的值必须是搜索的JSON的一部分,并且 2.第二个包含可选值 我的意思是只返回包含必选数组中的所有值和可选数组中至少一项的数组项 以下是我的尝试: const searchKeys = ['varWord', 'varTrans', 'varSpec'], obligatory = ['trip', 'pret'], optional = ['greet', 'lco', 'toto', 'ben
过滤器取决于两个阵列: 1.第一个包含的值必须是搜索的JSON的一部分,并且 2.第二个包含可选值 我的意思是只返回包含
必选
数组中的所有值和可选
数组中至少一项的数组项
以下是我的尝试:
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
)
);
它基本上归结为检查数据集的每个条目(数据
)中的相关值(通过搜索键
)之间的交集,另一方面:
必选
数组:交集必须是必选.长度
长度。i、 e.:它包含所有
必须集合中的项目
可选值数组:相交数组的长度必须=1
i、 e.:它包含至少一个可选集合中的项
这里有一个指向的链接。searchKeys是一个JSON键数组,其中包含搜索值。看起来工作正常。你想要什么样的输出。它正在返回varSpec:“trip”varTrans:“pret”varWord:“greet”stringPol:“group”stringDva:“groupGend”stringGit:“/tax”哦,是的,你是对的!谢谢你的时间,我的问题在代码的不同部分。谢谢你,伙计,非常感谢你的帮助并提供了示例。我要试试看。