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

如何正确删除JavaScript对象数组中的指定元素?

问题描述

我使用如下代码更新JS对象内的指定属性:

var main = {
          items: [
                  {
                    "name": "T-Shirt",
                    "description": "Green XL",
                    "quantity": "1",
                  },
                  {
                    "name": "Shoes",
                    "description": "Running, Size 10.5",
                    "quantity": "2",
                  }
                ]
        };

let project = main.items.find((p) => {
    return p.name === 'Shoes';
});

project.quantity = '3';
console.log(main); //shoes quantity is now 3

这段代码可以正常运行,但我还需要能够删除整个project对应的条目(比如示例中名为Shoes的整个对象块)。我尝试了如下写法:

let project = main.items.find((p) => {
    return p.name === 'Shoes';
});
delete project;

console.log(main); //shoes still exist

但代码并未生效,运行后Shoes条目仍然存在。请问删除该类属性的最佳实现方式是什么?
补充说明:我当时的核心问题是如何找到待删除元素对应的index。

解决方案

你之前的写法不生效,是因为delete project只是删除了project这个局部变量的绑定,该变量存储的是原数组中目标对象的引用,delete操作仅能删除对象属性或变量绑定,无法直接删除数组元素,因此原数组里的目标条目会完整保留。

以下是两种常用的实现方案:

方案1:通过findIndex定位下标后删除(修改原数组)

和find用法完全一致的findIndex方法可以直接拿到目标元素的下标,找不到时返回-1,确认下标有效后用splice删除对应位置的元素即可:

const targetIndex = main.items.findIndex(p => p.name === 'Shoes');
// 先判断是否找到对应元素,避免下标为-1时误删数组元素
if (targetIndex > -1) {
  // 从targetIndex位置开始,删除1个元素
  main.items.splice(targetIndex, 1);
}
console.log(main); // Shoes条目已被移除

方案2:通过filter过滤生成新数组(不修改原数组)

如果场景要求不可变数据(比如React状态更新),或者需要保留原数组,可以直接用filter方法过滤掉目标元素,返回新数组赋值即可:

// 保留所有name不等于Shoes的元素
main.items = main.items.filter(p => p.name !== 'Shoes');
console.log(main);

两种方案的适用场景:

  • 需要修改原数组、减少内存开销时选方案1
  • 需要保留原数组、符合不可变数据规范时选方案2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:21:02