如何使用另一个json数组过滤json数组?

时间:2018-12-17 09:27:38

标签: javascript node.js json

我有一个带有大量记录的json数组作为响应,但是我想通过使用另一个json数组来过滤该json数组。

我的json响应

http://prntscr.com/lvxwob

和我的过滤器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。

2 个答案:

答案 0 :(得分:1)

您可以在结果数组中filterfilterParams中的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);