我需要在数组的开头添加或预加元素。
例如,如果我的数组如下所示:
[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);
无突变
实际上,所有的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+
使用上述方法,您可以在没有变异的情况下添加到数组的开头/结尾。
在数组中准备新元素的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];
注意:在每个示例中,您都可以通过提供更多要插入的项目来准备多个项目。