You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选嵌套数组并映射为指定结构的新数据模型?

问题:将筛选后的subItems整理为指定结构的对象

我有一个包含数组的对象currentElement,希望根据type筛选数组内的对象,已通过.filter实现筛选。接下来需要将符合条件对象的subItems数组提取出来,整理为与currentElement结构一致的新对象newElement。

原数据

const currentElement = {
  items: [
   {
    "name": 'item',
    "subItems": [
     {
      "name": 'item 1',
      "type": 'item'
     },
     {
      "name": 'item 2',
      "type": 'item'
     }
    ],
    "type": 'subItems'
   },
   {
    "name": 'item',
    "type": 'item'
   }
  ]
}

目标数据

const newElement= {
      items: [
         {
          "name": 'item 1',
          "type": 'item'
         },
         {
          "name": 'item 2',
          "type": 'item'
         }
      ]
    }

尝试的代码

returnItems() {
    const items= this.currentElement.items.filter(item => item.type === 'subItems')
.map(({subItems}) => subItems);
    
    return items;
 }

这段代码返回了嵌套数组,无法得到预期的newElement结构,该如何解决?


解决方案

你之前的代码返回嵌套数组,是因为filter筛选出符合条件的对象后,map会把每个对象的subItems数组单独返回,最终得到的是数组的数组(比如[[item1, item2]]),而不是平级的item列表。同时你也没把结果包装成和原结构一致的{ items: [...] }对象。

这里提供两种简单的解决方法:

方法1:使用flatMap一步完成筛选+提取+扁平化

flatMap可以先对每个元素执行map操作,再自动将结果扁平化一层,非常适合这种场景:

returnItems() {
  // 遍历每个item,符合条件就返回subItems,否则返回空数组,最后自动扁平化
  const items = this.currentElement.items.flatMap(item => 
    item.type === 'subItems' ? item.subItems : []
  );
  // 包装成目标结构的对象
  return { items };
}

方法2:兼容旧环境的filter+map+flat

如果你的运行环境不支持flatMap,可以用filter+map后再调用flat()扁平化数组:

returnItems() {
  const items = this.currentElement.items
    .filter(item => item.type === 'subItems') // 筛选出带subItems的对象
    .map(item => item.subItems) // 提取每个对象的subItems数组
    .flat(); // 将数组的数组扁平化一维数组
  return { items }; // 包装成目标结构
}

两种方法最终都会返回你需要的newElement结构。


内容的提问来源于stack exchange,提问作者Can

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:55:33