我正在基于多个条件编写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",
}]
答案 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
标识)之间的交点 ),另一方面:
obligatory
的数组:交点的长度必须为obligatory.length
。obligatory
集合的所有项目optional
的数组:相交数组的长度必须为>= 1
。optional
集合的至少1 个项目这是指向working repl的链接。