使用 Javascript 过滤嵌套数组

filter nested array with Javascript

有一个包含对象的数组并在一个选项数组中,我如何按键值过滤对象的内部数组?

这是以下示例:

let test = [{
  "options": [{
     "label": "Audi",
     "value": 10
   },
    {
     "label": "BMW",
     "value": 18
   },
   {
     "label": "Mercedes Benz",
     "value": 116
   },
   {
     "label": "VW",
     "value": 184
   }
 ],
 "label": "test1"
},
{
 "options": [{
    "label": "Adler",
    "value": 3664
  },
  {
    "label": "Alfa Romeo",
    "value": 3
  },
  {
    "label": "Alpine",
    "value": 4
  }
],
 "label": "test2"
}
]

如何取回对象:

 {
   "label": "Audi",
   "value": 10
 }

如果我使用关键字 Audi

进行过滤
return label.toLowerCase().includes(inputValue.toLowerCase());

我尝试了以下

test.map((k) => {
              res = k.options.filter((j) => {
                inputValue.toLowerCase();
                if (j.label.toLowerCase().includes(inputValue.toLowerCase())) {
                  return j;
                }
              });
            });

您需要 return filter() 的结果,而不仅仅是将其分配给变量,这样 map() 就会 return 结果。

let test = [{
    "options": [{
        "label": "Audi",
        "value": 10
      },
      {
        "label": "BMW",
        "value": 18
      },
      {
        "label": "Mercedes Benz",
        "value": 116
      },
      {
        "label": "VW",
        "value": 184
      }
    ],
    "label": "test1"
  },
  {
    "options": [{
        "label": "Adler",
        "value": 3664
      },
      {
        "label": "Alfa Romeo",
        "value": 3
      },
      {
        "label": "Alpine",
        "value": 4
      }
    ],
    "label": "test2"
  }
]
let inputValue = "audi";
let search = inputValue.toLowerCase();
let result = test.map(k => k.options.filter(j => j.label.toLowerCase().includes(search)));
console.log(result);

这将 return 所有匹配搜索查询的选项:

function find(array, query) {
  return array.reduce((prev, current) => prev.concat(current.options), []).filter(item => item.label.includes(query))
}

find(test, 'Audi')

这可能会得到你的答案:

console.log(测试[0].选项[0]);

遍历数组时需要深入两层。

function filterArray(needle, haystack) {
  return haystack
    .map(h => h.options)
    .flatMap(h => h )
    .filter(h => h.label.toLowerCase().includes(needle.toLowerCase()));

CodeSandbox

使用 flatMap() 后跟 filter():

let test=[{options:[{label:"Audi",value:10},{label:"BMW",value:18},{label:"Mercedes Benz",value:116},{label:"VW",value:184}],label:"test1"},{options:[{label:"Adler",value:3664},{label:"Alfa Romeo",value:3},{label:"Alpine",value:4}],label:"test2"}]

let result = test.flatMap(el => {
    return el.options.filter(car => car.label == "Audi")
})[0]

console.log(result)