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

如何替换JavaScript数组中的对象及splice返回空数组问题排查

问题原因

核心问题出在splice方法的使用上:
Array.prototype.splice()是会直接修改原数组的实例方法,它的返回值是本次操作被删除的元素组成的数组。你代码中调用splice时第二个参数传了0,代表本次操作不删除任何元素,因此返回值是空数组,你将这个空数组直接赋值给了updatedTodo变量,最终就得到了空数组。

正确实现方式

方案1:更简洁的不可变更新(推荐)

不需要先删后插,直接通过map方法遍历数组匹配目标项更新即可,逻辑简单且不会出现索引错位问题:

const updatedTodos = oldTodos.map(todo => {
  // 匹配到目标id时返回更新后的对象
  if (todo.id === getTodoId) {
    return { ...todo, isCompleted: !getStatus }
  }
  // 非目标项直接返回原对象
  return todo
})

方案2:原有先删后插思路的修正版

如果要保留你现有的实现思路,只需要去掉splice的赋值操作即可,splice会直接修改updatedTodo数组,不需要重新赋值:

let thisTodoIndex = oldTodos.findIndex((t) => t.id === getTodoId);
let thisTodo = oldTodos[thisTodoIndex];
thisTodo = { ...thisTodo, isCompleted: !getStatus };

let updatedTodo = oldTodos.filter(td => td.id !== getTodoId);
// 直接调用splice即可,不要把返回值赋值给updatedTodo
updatedTodo.splice(thisTodoIndex, 0, thisTodo);

console.log(updatedTodo); // 输出正确的更新后数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:54:04