首页 > 解决方案 > 如何根据javascript中的动态值过滤数组

问题描述

我想根据动态值(名称和部分)过滤下面给定的数组。

var allResponse = [
{
  "name": "ABC",
  "class": "8",
  "section": "A",
},
{
  "name": "DEF",
  "class": "7",
  "section": "B",
},
{
  "name": "ABC",
  "class": "8",
  "section": "D",
},
]

这些name 和 section的值,我正在单击复选框。基于这些值,我想过滤这个给定的数组allResponse。值可以是多个,例如:过滤名称为 ABC 且部分为 A 和 D的数组,

就像在获得价值之后,我尝试创建一个对象来过滤,如下所示以迭代过滤。但做不到

var filterLiterals= [{"name": "ABC"},{"section": "A"},{"section": "D"}];
or
var filterLiterals= ["ABC","A","D"];

所以结果应该是

{
  "name": "ABC",
  "class": "8",
  "section": "A",
},

我很困惑应该遵循哪种方法来获得结果。

我尝试使用 || 和 && 运算符但无法得到我想要的结果。

有人可以建议我采用合适且适当的方法来过滤此数组。我做不到。

是否可以以任何方式在javascript中以这种方式过滤......?

标签: javascriptfilter

解决方案


据我了解,我需要在下面找到令人满意的元素,

名称:ABC 部分:A 或 D

var allResponse = [
    {
        "name": "ABC",
        "class": "8",
        "section": "A",
    },
    {
        "name": "DEF",
        "class": "7",
        "section": "B",
    },
    {
        "name": "ABC",
        "class": "8",
        "section": "D",
    },  
];

var filterLiterals = [
    {"name": "ABC"},
    {"section": "A"},
    {"section": "D"}
];

const parsed = filterLiterals.reduce((acc, obj) => {
    const key = Object.keys(obj)[0];
    if (typeof acc[key] === 'undefined')
        acc[key] = [obj[key]];
    else 
        acc[key].push(obj[key]);
    return acc;
}, {});

//console.log("parsed: ", parsed);

var answer = allResponse.filter(obj => {
    let flag = true;
    for (const key of Object.keys(parsed)) {
        if (!parsed[key].includes(obj[key])) {
            flag = false;
            break;
        }
    }
    return flag;
});

console.log(answer);

运行这个!


推荐阅读