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

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

[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),看到更好的实现会非常有趣。


当前回答

使用非移位。这类似于push,只是它将元素添加到数组的开头而不是结尾。

unshift/push-将元素添加到数组的开始/结束shift/pop-删除并返回数组的第一个/最后一个元素

一个简单的图表。。。

   unshift -> [array] <- push
   shift   <- [array] -> pop
 

和图表:

          add  remove  start  end
   push    X                   X
    pop           X            X
unshift    X             X
  shift           X      X

查看MDN阵列文档。事实上,每一种能够从数组中推送/弹出元素的语言都可以取消推送/移位(有时称为push_front/pop_front)元素,您不必自己实现这些元素。


正如注释中所指出的,如果您想避免改变原始数组,可以使用concat,它将两个或多个数组连接在一起。您可以使用它在功能上将单个元素推到现有阵列的前面或后面;为此,需要将新元素转换为单个元素数组:

常量数组=[3,2,1]常量newFirstElement=4const newArray=[newFirstElement].contat(array)//[4,3,2,1]console.log(newArray);

concat还可以附加项。concat的参数可以是任何类型;如果它们还不是数组,则隐式地封装在单个元素数组中:

常量数组=[3,2,1]常量newLastElement=0//这两条线都是等效的:const newArray1=array.contat(newLastElement)//[3,2,1,0]const newArray2=array.contat([newLastElement])//[3,2,1,0]console.log(newArray1);console.log(newArray2);

其他回答

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

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

使用非移位。这类似于push,只是它将元素添加到数组的开头而不是结尾。

unshift/push-将元素添加到数组的开始/结束shift/pop-删除并返回数组的第一个/最后一个元素

一个简单的图表。。。

   unshift -> [array] <- push
   shift   <- [array] -> pop
 

和图表:

          add  remove  start  end
   push    X                   X
    pop           X            X
unshift    X             X
  shift           X      X

查看MDN阵列文档。事实上,每一种能够从数组中推送/弹出元素的语言都可以取消推送/移位(有时称为push_front/pop_front)元素,您不必自己实现这些元素。


正如注释中所指出的,如果您想避免改变原始数组,可以使用concat,它将两个或多个数组连接在一起。您可以使用它在功能上将单个元素推到现有阵列的前面或后面;为此,需要将新元素转换为单个元素数组:

常量数组=[3,2,1]常量newFirstElement=4const newArray=[newFirstElement].contat(array)//[4,3,2,1]console.log(newArray);

concat还可以附加项。concat的参数可以是任何类型;如果它们还不是数组,则隐式地封装在单个元素数组中:

常量数组=[3,2,1]常量newLastElement=0//这两条线都是等效的:const newArray1=array.contat(newLastElement)//[3,2,1,0]const newArray2=array.contat([newLastElement])//[3,2,1,0]console.log(newArray1);console.log(newArray2);

使用ES6破坏(避免原始数组的突变):

const newArr=[item,…oldArr]

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

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

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

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