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

如何删除嵌套对象数组中hobby为dance的元素?

移除嵌套对象数组中所有hobby为dance的项

原代码的问题

用forEach遍历category数组并结合splice删除元素时,会出现元素跳过检查的情况。因为splice删除元素后数组长度缩短,后续元素向前移位,但forEach的遍历索引仍按原顺序递增,导致部分元素没被检查到(比如数组中有连续两个dance项时,第二个会被跳过)。

解决方案1:倒序遍历修改原数组

通过倒序遍历数组,即使删除当前元素,前面的元素索引不会受影响,能确保每个元素都被检查到:

const people = [{
    id: 1,
    documents: [{
        id: 1,
        category: [{ hobby: 'soccer' }, { hobby: 'dance' }]
      },
      { id: 2, category: [{ hobby: 'soccer' }, { hobby: 'dance' }] }
    ]
  },
  {
    id: 2,
    documents: [{
        id: 1,
        category: [{ hobby: 'dance' }, { hobby: 'soccer' }]
      },
      { id: 2, category: [{ hobby: 'soccer' }, { hobby: 'dance' }] }
    ]
  }
];

people.forEach(person => {
  person.documents.forEach(document => {
    // 从数组末尾开始遍历
    for (let i = document.category.length - 1; i >= 0; i--) {
      if (document.category[i].hobby === 'dance') {
        document.category.splice(i, 1);
      }
    }
  });
});

console.log(people);

解决方案2:使用filter创建新数组(推荐)

这种方式不修改原数组,通过map和filter生成新的处理后数组,代码简洁且无副作用:

const people = [{
    id: 1,
    documents: [{
        id: 1,
        category: [{ hobby: 'soccer' }, { hobby: 'dance' }]
      },
      { id: 2, category: [{ hobby: 'soccer' }, { hobby: 'dance' }] }
    ]
  },
  {
    id: 2,
    documents: [{
        id: 1,
        category: [{ hobby: 'dance' }, { hobby: 'soccer' }]
      },
      { id: 2, category: [{ hobby: 'soccer' }, { hobby: 'dance' }] }
    ]
  }
];

const filteredPeople = people.map(person => ({
  ...person,
  documents: person.documents.map(doc => ({
    ...doc,
    category: doc.category.filter(cat => cat.hobby !== 'dance')
  }))
}));

console.log(filteredPeople);

两种方案对比

  • 方案1直接修改原数组,适合需要保留原对象引用的场景;
  • 方案2创建新数组,避免修改原数据带来的潜在副作用,更符合现代JavaScript函数式编程风格,推荐优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:12:41