JavaScript如何不使用push向指定ID用户的cars数组追加新对象
回答
你现在用的concat本身就是不用push的实现方式,但存在一个问题:concat不会改动原数组,只会返回合并后的新数组,你当前的代码没有把新数组赋值回原用户的cars属性,所以原inventory里id=1的用户数据并不会更新。
给你几个更常用、更简洁的无push实现,按场景选择即可:
- 不可变写法(推荐,无副作用):用数组扩展运算符,代码可读性最高,也是目前前端开发的主流写法
const targetUser = inventory.find(item => item.id === 1); // 生成新数组替换原cars属性,不会修改旧的cars数组引用 targetUser.cars = [...targetUser.cars, { model: "Porsche", year: "2009" }]; - 原数组修改写法1:splice实现:直接在原数组上插入元素,不需要生成新数组
const targetUser = inventory.find(item => item.id === 1); // 第一个参数指定插入位置为数组末尾,第二个参数传0代表不删除元素,后面传入要插入的内容 targetUser.cars.splice(targetUser.cars.length, 0, { model: "Porsche", year: "2009" }); - 原数组修改写法2:索引直接赋值:最原生的写法,本质和push的底层实现逻辑一致
const targetUser = inventory.find(item => item.id === 1); targetUser.cars[targetUser.cars.length] = { model: "Porsche", year: "2009" };
补充:如果你需要完全不修改原
inventory的所有数据(比如React状态更新场景),可以在遍历inventory的时候生成全新的数组和对象,连原用户对象的引用都不改动:const newInventory = inventory.map(user => { if(user.id !== 1) return user; return { ...user, cars: [...user.cars, { model: "Porsche", year: "2009" }] } })
内容的提问来源于stack exchange,提问作者user2286483
相关产品推荐
相关产品推荐

