我需要在数组的开头添加或预加元素。

例如,如果我的数组如下所示:

[23, 45, 12, 67]

AJAX调用的响应是34,我希望更新后的数组如下所示:

[34, 23, 45, 12, 67]

目前我计划这样做:

var newArray = [];
newArray.push(response);

for (var i = 0; i < theArray.length; i++) {
    newArray.push(theArray[i]);
}

theArray = newArray;
delete newArray;

有更好的方法吗?JavaScript是否有任何内置功能来实现这一点?

我的方法的复杂性是O(n),看到更好的实现会非常有趣。


当前回答

无突变

实际上,所有的unshift/push和shift/pop都会改变源数组。

unshift/push从开始/结束向现有数组添加一个项,并从数组的开始/结束移除一个项。

但是,很少有方法可以在没有变异的情况下将项目添加到数组中。结果是一个新数组,要添加到数组末尾,请使用以下代码:

const originArray = ['one', 'two', 'three'];
const newItem = 4;

const newArray = originArray.concat(newItem); // ES5
const newArray2 = [...originArray, newItem]; // ES6+

要添加到原始数组的开头,请使用以下代码:

const originArray = ['one', 'two', 'three'];
const newItem = 0;

const newArray = (originArray.slice().reverse().concat(newItem)).reverse(); // ES5
const newArray2 = [newItem, ...originArray]; // ES6+

使用上述方法,您可以在没有变异的情况下添加到数组的开头/结尾。

其他回答

您有一个数组:var arr=[23,45,12,67];

要将项目添加到开头,需要使用拼接:

var arr=[23,45,12,67];arr.splice(0,0,34)控制台日志(arr);

在数组中准备新元素的Cheatsheet

1.阵列#未移位

常量列表=[23,45,12,67];list.unshift(34);console.log(列表);//[34, 23, 45, 12, 67];

2.阵列#拼接

常量列表=[23,45,12,67];列表.拼接(0,0,34);console.log(列表);//[34, 23, 45, 12, 67];

3.ES6扩散。。。

常量列表=[23,45,12,67];常量newList=[34,…list];console.log(newList);//[34, 23, 45, 12, 67];

4.数组#concat

常量列表=[23,45,12,67];常量newList=[32].contat(列表);console.log(newList);//[34, 23, 45, 12, 67];

注意:在每个示例中,您都可以通过提供更多要插入的项目来准备多个项目。

无突变

实际上,所有的unshift/push和shift/pop都会改变源数组。

unshift/push从开始/结束向现有数组添加一个项,并从数组的开始/结束移除一个项。

但是,很少有方法可以在没有变异的情况下将项目添加到数组中。结果是一个新数组,要添加到数组末尾,请使用以下代码:

const originArray = ['one', 'two', 'three'];
const newItem = 4;

const newArray = originArray.concat(newItem); // ES5
const newArray2 = [...originArray, newItem]; // ES6+

要添加到原始数组的开头,请使用以下代码:

const originArray = ['one', 'two', 'three'];
const newItem = 0;

const newArray = (originArray.slice().reverse().concat(newItem)).reverse(); // ES5
const newArray2 = [newItem, ...originArray]; // ES6+

使用上述方法,您可以在没有变异的情况下添加到数组的开头/结尾。

变量a=[23,45,12,67];a.未移位(34);console.log(a);//[34, 23, 45, 12, 67]

如果需要在数组的开头连续插入元素,那么使用push语句后跟一个反向调用会更快,而不是一直调用unshift。

基准测试:http://jsben.ch/kLIYf