【问题标题】:How to filter nested arrays (composing JS filters) [duplicate]如何过滤嵌套数组(组成JS过滤器)[重复]
【发布时间】:2019-06-24 18:05:11
【问题描述】:

我试图返回一个根据对象的子属性过滤的新数组。

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

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'所在的原始数组?

【问题讨论】:

  • 是的,您的内部 filter 返回一个空数组,该数组被评估为 true,因此没有任何内容被过滤。将.length 添加到内部过滤器或使用.some
  • .some 返回{ id: 1, status: 'Y' }, { id: 1, status: 'N' }, { id: 2, status: 'Y' }

标签: javascript arrays


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    要达到预期的效果,请使用以下使用reduce的选项

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

    工作代码

    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

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 2023-02-19
      • 2021-10-21
      • 2017-01-28
      • 2019-07-19
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多