使用基于嵌套值的数组过滤对象数组

新手上路,请多包涵

我正在尝试根据一些嵌套对象过滤一个数组。我准备了一些 小提琴

输入数组如下所示:

 let arrayOfElements =
    [
        {
           "name": "a",
           "subElements":
           [
             {"surname": 1},
             {"surname": 2}
           ]
        },
        {
           "name": "b",
           "subElements":
           [
             {"surname": 3},
             {"surname": 1}
           ]
        },
        {
           "name": "c",
           "subElements":
           [
             {"surname": 2},
             {"surname": 5}
           ]
        }
    ];

我希望这种情况的输出看起来像这样:

 let filteredArray =
    [
        {
          "name": "a",
          "subElements":
          [
            {"surname": 1}
          ]
        },
        {
          "name": "b",
          "subElements":
          [
            {"surname": 1}
          ]
        }
];

我正在使用这个公式来做到这一点:

 let filteredArray = arrayOfElements.filter((element) => element.subElements.some((subElement) => subElement.surname === 1));

输出几乎是好的,但它返回的对象包含所有带有姓氏的对象(最好检查小提琴 :D),而不是将它们切掉。我怎样才能改进过滤?

原文由 bartosz.baczek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 639
2 个回答

这样你就可以在数组中任意深入,并在任何级别过滤元素,

 arrayOfElements.map((element) => {
  return {...element, subElements: element.subElements.filter((subElement) => subElement.surname === 1)}
})

Spread operator subElements 扩展 element 然后过滤 - 然后过滤 - 然后过滤 subElements

原文由 Nitesh Ranjan 发布,翻译遵循 CC BY-SA 4.0 许可协议

在调用 filter 之后,您需要将结果通过管道传输到 map ,如下所示:

 let filteredArray = arrayOfElements
  .filter((element) =>
    element.subElements.some((subElement) => subElement.surname === 1))
  .map(element => {
    let newElt = Object.assign({}, element); // copies element
    return newElt.subElements.filter(subElement => subElement.surname === '1');
  });

我在这里假设您不想操作原始数组。所以,我正在使用 Object.assign。

原文由 Andrew Eisenberg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏