Javascript 不可变-使用切片(无拼接)更改数组中的元素

Javascript 不可变-使用切片(无拼接)更改数组中的元素,javascript,slice,immutable.js,Javascript,Slice,Immutable.js,如何更改3/4元素?预期产量为[1,2,4,3,5] let list = [1,2,3,4,5]; const removeElement = list.indexOf(3); // remove number 3 list.slice(0, removeElement).concat(list.slice(removeElement+1)) // [1,2,4,5] …不带拼接的4号之后的下一次推送3号切片不会变异其操作的数组,因此需要为其返回的值赋值 let list = [1,2,3,

如何更改3/4元素?预期产量为[1,2,4,3,5]

let list = [1,2,3,4,5];
const removeElement = list.indexOf(3); // remove number 3
list.slice(0, removeElement).concat(list.slice(removeElement+1)) // [1,2,4,5]
…不带拼接的4号之后的下一次推送3号切片不会变异其操作的数组,因此需要为其返回的值赋值

let list = [1,2,3,4,5];
const removeElement = list.indexOf(3); // remove number 3
var newList = list.slice(0, removeElement).concat(list.slice(removeElement+1)) // [1,2,4,5]
如果您准备使用ES2015语法,可以按如下方式使用扩展运算符:

const removeElement = list.indexOf(3); // remove number 3
var es6List = [
  ...list.slice(0, removeElement),
  ...list.slice(removeElement+1)
];
console.log(es6List);

编写此命令的最简单方法是使用扩展运算符:

let newList = [...list.slice(0, 2), list[4], list[3], ...list.slice(4)];

数组是对象,使用Object.assign()并使用属性名表达式访问元素

var numToMove = 2;
console.log(Object.assign(list, {[numToMove]: list[numToMove+1]}, 
{[numToMove+1]: list[numToMove]}));
// [1, 2, 4, 3, 5]

Object.assign实际上在这里工作

const newList=Object.assign([],list{
2:列表[3],
3:列表[2],
});
列表/[1,2,3,4,5]
newList/[1,2,4,3,5]
newList==list//false

更简单的解决方案可能是使用
过滤器,而不是拼接或切片。根据文件

filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素

这意味着原始数组保持不变。唯一的区别是,在这种情况下,您必须知道要删除的值,而不是索引

let list = [1,2,3,4,5];
list.filter((item) => item !== 3);

但是为什么没有拼接呢?Splice就是为了这个目的而设计的…@Dellirium
Array.prototype.Splice()
不是一成不变的。它修改给定的数组。看起来OP正在寻找一个不可改变的解决方案。@chrisg86我可以发誓,当我写那个评论时,这个问题的措辞不是这样的,但可能是错误的<代码>切片().splice()
虽然有效,但出于不变性
切片().splice()
(复制然后使用splice)不起作用,因为splice返回删除的元素,不是更新的数组只需将最后一行中创建的新数组放入一些变量中注意,这并不能严格回答问题,因为它缺少将3推到4之后的最后一部分。这样可以去掉3,但需要将其注入到4之后的数组中。这就是您需要的
拼接
let list = [1,2,3,4,5];
list.filter((item) => item !== 3);