如何过滤嵌套数组(组成JS过滤器)

时间:2019-06-24 18:05:11

标签: javascript arrays

A正在尝试返回一个根据对象的子属性过滤的新数组。

我正在尝试将两个过滤器嵌套在一起以实现此结果。

let header = "xyz";

let data = [{
  "header": header,
  items: [{
    id: 1,
    status: "Y"
  }, {
    id: 2,
    status: "N"
  }, {
    id: 3,
    status: "N"
  }]
},{
  "header": header,
  items: [{
    id: 1,
    status: "N"
  }, {
    id: 2,
    status: "Y"
  }]
}];

let result = data.filter(item => {
  return item.items.filter(item => {
    return item.status === "Y";
  })
});

预期产量

[{
  "header": header,
  items: [{
    id: 1,
    status: "Y"
  }]
},{
  "header": header,
  items: [{
    id: 2,
    status: "Y"
  }]
}];

如何在status === 'Y'处过滤原始数组?

2 个答案:

答案 0 :(得分:2)

您可以先映射以获得具有已过滤子项的等效数组,然后过滤主数组以删除没有子项的元素。

let result = data.map(item => {
    return {
        header: item.header,
        items: item.items.filter(subItem => subItem.status === 'Y')
    };
}).filter(item => item.items.length);

答案 1 :(得分:1)

要获得预期结果,请使用以下使用reduce的选项

  1. 使用reduce循环数据
  2. 在推送到reduce的累加器-acc之前更新每个object.item

工作代码

let header = "xyz";

let data = [{
  "header": header,
  items: [{
    id: 1,
    status: "Y"
  }, {
    id: 2,
    status: "N"
  }, {
    id: 3,
    status: "N"
  }]
},{
  "header": header,
  items: [{
    id: 1,
    status: "N"
  }, {
    id: 2,
    status: "Y"
  }]
}];

console.log(data.reduce((acc,v) => {
  v. items = v.items.filter(item => {
    return item.status === "Y";
  })
  acc.push(v)
   return acc
}, []))

codepen-https://codepen.io/nagasai/pen/EBXvLx