我有一个带有大量记录的json数组作为响应,但是我想通过使用另一个json数组来过滤该json数组。
我的json响应
和我的过滤器json数组就像
"filterParams" : [
{
"param" : "actualSum",
"value" : "95",
"type" : "text",
"comparision" : "isEqual"
},
{
"param" : "wbsSort",
"value" : "6",
"type" : "text",
"comparision" : "isEqual"
}
],
所以我该如何使用javascript或node js过滤我的响应。我想获取已过滤的数据,例如具有响应参数及其值的匹配参数。
例如 如果实际值的匹配值等于95,而wbsSort的值等于6,则返回true,否则返回false。
答案 0 :(得分:1)
您可以在结果数组中filter与filterParams
中的every参数相匹配的项目。如果您只想检查是否存在至少一个匹配项,请用.some
.filter
例如
var matches = results.filter(item =>
filterParams.every(paramItem =>
item[paramItem.param] === paramItem.value));
我已将其限制为等于比较,但是您可以根据自己拥有的其他比较类型,使用switch
来扩展比较。
答案 1 :(得分:0)
一种无需对每个检查进行硬编码的方法是使用filterParams
创建一个比较函数。因此,您将执行类似的操作,其中compareFunction
使用filterParams
创建一个新函数来初始化要检查的变量,并返回当前项目是否具有这些值。因此,对于您要进行的任何进一步检查,您只需要将其添加到filterParams中即可。希望这会有所帮助。
const filterParams = [{
"param" : "actualSum",
"value" : "95",
"type" : "text",
"comparison" : "isEqual"
}, {
"param" : "wbsSort",
"value" : "6",
"type" : "text",
"comparison" : "isEqual"
}];
const data = [{ actualSum: 95, wbsSort: 6 }, { actualSum: 95, wbsSort: 10 }];
const operators = {
'isEqual': '==='
};
const compareFunction = (params) =>
(item) => new Function(
params.reduce((acc, { param, value }) => `${acc} const ${param} = ${value};`, '') +
params.reduce((acc, { param, value, comparison }, i) => `${acc} ${param} ${operators[comparison]} ${item[param]} ${i !== params.length - 1 ? '&&' : ';'}`, 'return ')
)();
const filteredData = data.filter(compareFunction(filterParams));
console.log(filteredData);