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

时间:2016-11-22 08:56:12

标签: javascript slice immutable.js

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

false

...在没有拼接的情况下,在第4号之后推送数字3

6 个答案:

答案 0 :(得分:14)

slice 不会改变它运行的数组,因此你需要为它返回的值赋值

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语法,可以按如下方式使用 spread 运算符:

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

fiddle

答案 1 :(得分:6)

最简单的方法是使用扩展运算符:

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

答案 2 :(得分:3)

var list = [1,2,3,4,5];
var numToRemove = 3;

var removeElementIndex = list.indexOf(numToRemove);
var afterRemoveElement = list[removeElementIndex+1];

list.slice(0, removeElementIndex).concat(afterRemoveElement).concat(numToRemove).concat(list.slice(removeElementIndex+2)) // [1,2,4,3,5]

答案 3 :(得分:1)

Object.assign实际上在这里起作用

const newList = Object.assign([], list, {
  2: list[3],
  3: list[2],
});

list // [1,2,3,4,5]
newList // [1,2,4,3,5]
newList === list // false

答案 4 :(得分:0)

更轻松的解决方案可能是使用filter而不是拼接或切片。根据文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

  

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

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

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

答案 5 :(得分:-1)

数组是对象,使用Object.assign()和访问具有属性名称表达式的元素。

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