2890

如何在JavaScript中将对象(例如字符串或数字)附加到数组?

30个答案30

重置为默认值
5358

使用数组原型.push方法将值附加到数组末尾:

//初始化数组var arr=[“嗨”,“你好”,“你好”];//将新值附加到数组arr.push(“Hola”);控制台.log(arr);


您可以使用push()函数在单个调用中向数组追加多个值:

//初始化数组var arr=[“嗨”,“你好”,“您好”,“大家好”];//将多个值附加到数组arr.push(“Salut”,“Hey”);//显示所有值对于(var i=0;i<arr.length;i++){控制台.log(arr[i]);}

请注意push()方法返回数组的更新长度。


更新

如果要将一个数组的项添加到另一个数组中,可以使用firstArray.concat(secondArray):

变量arr=[“苹果”,“香蕉”,“樱桃”];//不要忘记分配结果,因为与push不同,concat不会更改现有数组arr=arr.concat([“火龙果”,“接骨木”,“无花果”]);console.log(arr);

更新

如果您想在数组的开头(即第一个索引)添加任何值,那么可以使用数组.prototype.unshift为此目的。

var arr=[1,2,3];arr.unshift(0);控制台.log(arr);

它还支持一次附加多个值,就像.


更新

另一种方式欧洲标准6语法是用扩展语法。这将保持原始数组不变,但返回一个新数组,其中附加或添加了新项,符合函数编程的精神。

常量arr=[“嗨”,“你好”,“你好”,];常量newArr1=[…啊,“Salut”,];常量newArr2=[“Salut”,…啊,];控制台.log(newArr1,newArr2);

  • 185
    请注意,.push的返回值不是数组(或新数组,如.concat),而是表示数组新长度的整数。
    – 杰伊
    评论 2016年1月10日0:09
  • 2
    据我所知,取消移位(按原样转移)是唯一的就地变量,而凹面(concat)扩展语法克隆阵列。 评论 2023年3月7日9:41
  • 1
    当然要使用扩散选项,因为它不会改变对象。它应该位于答案的顶部。
    – 盲人
    评论 2023年8月5日22:55
1122

如果只附加一个变量,那么push()效果很好。如果需要附加另一个数组,请使用concat():

变量ar1=[1,2,3];变量ar2=[4,5,6];var ar3=ar1.concat(ar2);警报(ar1);警报(ar2);警报(ar3);

concat不影响ar1型ar2型除非重新分配,例如:

变量ar1=[1,2,3];变量ar2=[4,5,6];ar1=ar1.concat(ar2);警报(ar1);

有很多关于JavaScript参考.

9
  • 176
    只需确保人们捕捉到var ar3=ar1.concat(ar2);部分。concat(ar2)不会将值保存到ar1中。您必须通过将其分配给ar3或返回ar1来捕获它,例如:ar1=ar1.concat(ar2); 评论 2013年7月12日22:47
  • 39
    我想说这实际上是错误的答案。问题是如何在JavaScript中附加到数组?,但是凹面(concat)事实上创建新的阵列。这是一个重要的区别!相反,我想说,下面由Omnimike给出的答案实际上是最好的:使用推送应用程序将整个数组推送到现有数组而不创建新数组。 评论 2015年9月18日13:09
  • @StijndeWitt您仍然可以在不创建新数组的情况下追加,如前一条注释所述ar1=ar1.concat(ar2);将附加到ar1型 评论 2016年4月1日1:30
  • @cameronjoneweb实际上,它所做的是创建一个新数组,其内容与ar1型,追加ar2型然后返回新的数组。只需省略作业部分(ar1=。。。)从这行代码中,您将看到起初的 ar1型事实上没有改变。如果你想避免复制,你需要.别相信我,相信文档:“concat()方法返回一个新数组”凹面(concat). 评论 2016年4月3日13:26
  • @StijndeWitt你说得对。但是,从另一个角度来看,.push只适用于添加单个变量/对象,但在附加数组时却会出现问题ar2型无论如何,以上都是。的结果.推动在该场景中=[ar1,[ar2]..concat解决了这个问题,但牺牲了速度并创建了一个新的数组。要使用.推动正确地在数组附加中,首先循环出包含的元素并推送每个元素。ar2.forEach(each=>{ar1.push(each);});
    – 阿德
    评论 2018年4月7日18:29
428

一些快速基准测试(每个测试=500k个附加元素,结果是多次运行的平均值)显示如下:

Firefox 3.6(Mac):

  • 小型阵列:arr[arr.length]=b速度更快(300毫秒与800毫秒)
  • 大型阵列:推力(b)速度更快(500毫秒vs.900毫秒)

Safari 5.0(Mac):

  • 小型阵列:arr[arr.length]=b速度更快(90毫秒vs.115毫秒)
  • 大型阵列:arr[arr.length]=b速度更快(160毫秒vs.185毫秒)

谷歌Chrome 6.0(Mac):

  • 小型阵列:无显著差异(而且Chrome速度很快!只有38毫秒!!)
  • 大型阵列:无显著差异(160毫秒)

我喜欢arr.push()语法更好,但我想我最好用棱[棱长]版本,至少以原始速度。不过,我很想看看IE运行的结果。


我的基准循环:

函数arrpush_small(){变量arr1=[];对于(a=0;a<100;a++){arr1=[];对于(i=0;i<5000;i++){arr1.推('elem'+i);}}}函数arrlen_small(){变量arr2=[];对于(b=0;b<100;b++){arr2=[];对于(j=0;j<5000;j++){arr2[arr2.length]=‘元素’+j;}}}函数arrpush_large(){var arr1=[];对于(i=0;i<500000;i++){arr1.推('elem'+i);}}函数arrlen_large(){var arr2=[];对于(j=0;j<500000;j++){arr2[arr2.length]=‘元素’+j;}}
7
  • 9
    问题是.length是存储值还是在访问时计算的,因为如果后者为真,那么使用简单变量(例如j)作为索引值可能会更快 评论 2012年8月15日18:55
  • 4
    希望在同一测试中看到concat()!
    – 贾斯廷
    评论 2013年4月30日0:10
  • 2
    我想知道在过去的四年里,这种情况发生了多大的变化。(jsperf现在很方便。)
    – 德莱普
    评论 2014年5月26日20:07
  • 8
    这种类型的基准测试很有趣,但具有讽刺意味的是,它对加快应用程序的速度没有太大帮助。到目前为止,渲染循环在任何周期中都要昂贵得多。此外,浏览器开发人员正在不断优化JS语言的这些内部结构。这就是我投反对票的原因,而不是这个答案的有趣之处。如果你想要更快的应用程序,首先进行基准测试,然后看看要改变什么-100次中有99次不会像这个测试显示的那样成为问题。通常情况下,它的开发人员JS/CSS很差劲,而不是让它变慢的浏览器内部。 评论 2014年9月25日21:59
  • 8
    我同意LessQuesar尽可能坚持内置。并不是说微优化本身就不好,但他是对的,浏览器总是在提高其引擎速度。恰当的例子:在撰写本文时,对于上面列出的所有技术,每浏览器的性能几乎相同。这意味着几年前对如此小的收益大惊小怪,而现在却一无所获。
    – 比约尔
    评论 2015年8月13日0:35
342

我认为值得一提的是,可以使用多个参数调用push,这些参数将按顺序附加到数组中。例如:

var arr=['first'];arr.push('second','third');控制台.log(arr);

因此,您可以使用push.apply将数组附加到另一个数组,如下所示:

var arr=['first'];arr.push('second','third');arr.push.apply(arr,[‘forth’,‘fifth’]);控制台.log(arr);

带注释的ES5有关于具体内容的更多信息应用这样做。

2016年更新:有传播,你不需要应用还有,比如:

var arr=['first'];arr.push('second','third');arr.push(…[第四个,第五个]);控制台.log(arr);

4
  • 31
    在不创建新数组的情况下追加项数组的最佳解决方案。 评论 2014年8月20日18:45
  • 1
    @特别是GabrielLittman,因为附加到数组IMHO应该修改数组,而不是创建新数组。 评论 2014年8月22日1:44
  • 4
    我喜欢push.apply版本,宁愿使用Array.prototype.push.apply()尽管如此。
    – 迈克尔
    评论 2015年2月16日23:41
  • 2
    有时,保留对数组的引用很重要,例如在AngularJ中,当某个数组在某个控制器上的作用域内,并且某些服务需要更新数组中的数据以进行显示时。这就是为什么我支持这个解决方案。 评论 2016年3月15日4:14
86

您可以使用应用函数附加两个数组。

var数组1=[11,32,75];var数组2=[99,67,34];Array.prototype.push.apply(array1,array2);控制台.log(array1);

它将附加阵列2阵列1.现在阵列1包含[11, 32, 75, 99, 67, 34].这段代码比编写要简单得多对于循环以复制数组中的每个项。

4
  • 这就是我所需要的,保持原始数组引用 评论 2016年2月12日10:15
  • 如果您使用ES6/7,还可以...运算符而不是apply常数a1=[]常数a2=[5,6,7]常数推力(…a2)编辑:语法高亮显示 评论 2018年10月5日9:54
  • 1
    我会用数组1.concat(数组2)在这种情况下。呼叫似乎没有必要。 评论 2019年5月3日0:10
  • 凹面(concat)制作副本。呼叫除了打电话给凹面(concat)。要将多个项附加到现有数组,是最好的解决方案。 评论 2022年2月15日9:13
73

使用新ES6扩散算子,使用连接两个数组变得更加容易:

var arr=[1,2,3,4,5];var arr2=[6,7,8,9,10];arr.push(…arr2);控制台.log(arr);

这添加了棱2在…的末尾自动调整.

Babel REPL示例

0
57

如果阿珥是一个数组,并且val值是要添加使用的值:

arr.push(val);

例如。

var arr=['a','b','c'];arr.push(d');控制台.log(arr);

0
53

使用凹面(concat):

a=[1,2,3];b=[3,4,5];a=a.concat(b);控制台.log(a);

49

JavaScript与ECMA脚本5(ES5)标准,现在大多数浏览器都支持,您可以使用应用()附加阵列1阵列2.

变量数组1=[3,4,5];var数组2=[1,2];Array.prototype.push.apply(array2,array1);控制台.log(array2);//[1, 2, 3, 4, 5]

JavaScript与ECMA脚本6支持的(ES6)标准,Firefox浏览器,Internet Explorer(Internet Explorer)、和边缘,您可以使用传播操作员:

“使用严格”;设array1=[3,4,5];设array2=[1,2];阵列2.推送(…阵列1);控制台.log(array2);//[1, 2, 3, 4, 5]

这个传播操作员将替换阵列2.推送(…阵列1);具有阵列2.推动(3,4,5);当浏览器思考逻辑时。

奖励积分

如果您想创建另一个变量来存储两个数组中的所有项,可以这样做:

欧洲标准5 var combinedArray=数组1.concat(数组2);

欧洲标准6 const combinedArray=[…数组1,…数组2]

扩散运算符(...)是将集合中的所有项目展开。

34

如果要附加两个数组-

var a=['a','b'];变量b=['c','d'];

然后您可以使用:

var c=a.concat(b);

如果你想添加记录到阵列(var a=[])然后您可以使用:

a.推动(“g”);
32

有几种方法可以在JavaScript中附加数组:

1)这个push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

变量a=[1,2,3];a.推动(4,5);控制台.log(a);

输出:

[1, 2, 3, 4, 5]

2)这个取消移位()方法将一个或多个元素添加到数组的开头,并返回数组的新长度:

变量a=[1,2,3];a.卸载(4、5);控制台.log(a);

输出:

[4, 5, 1, 2, 3]

3)这个concat()方法用于合并两个或多个数组。这个方法不会改变现有数组,但返回一个新数组。

var arr1=[“a”,“b”,“c”];var arr2=[“d”,“e”,“f”];var arr3=arr1.concat(arr2);控制台.log(arr3);

输出:

[“a”、“b”、“c”、“d”、“e”、“f”]

4)您可以使用阵列的.长度属性将元素添加到数组末尾:

var ar=['one','two','three'];ar[ar.length]=“四个”;console.log(ar);

输出:

[“一”、“二”、“三”、“四”]

5)这个拼接()方法通过删除现有元素和/或添加新元素来更改数组的内容:

var myFish=[“天使”、“小丑”、“普通话”、“外科医生”];myFish.拼接(4,0,“nemo”);//数组.splice(start,deleteCount,item1,item2,…)console.log(myFish);

输出:

[“天使”、“小丑”、“普通话”、“外科医生”、“尼莫”]

6)您还可以通过指定新索引并赋值,将新元素添加到数组中:

var ar=[一个,两个,三个];ar[3]=“四”;//向ar添加新元素console.log(ar);

输出:

[“一”、“二”、“三”、“四”]
1
  • 对于1),这表示“不修改原始数组”does:它通过将新元素添加到原始数组中来修改数组。我读错了吗,还是应该编辑? 评论 2017年5月24日15:17
25

这个push()方法将新项添加到数组的末尾,并返回新长度。例子:

var水果=[“香蕉”,“橘子”,“苹果”,“芒果”];水果。push(“猕猴桃”);//水果的结果是:香蕉、橘子、苹果、芒果、猕猴桃

您的问题的确切答案已经得到了回答,但让我们看看其他一些向数组添加项的方法。

这个取消提升()方法将新项添加到数组的开头,并返回新长度。例子:

var水果=[“香蕉”,“橘子”,“苹果”,“芒果”];水果(“柠檬”、“菠萝”);//水果的结果是:柠檬、菠萝、香蕉、橘子、苹果、芒果

最后concat()方法用于联接两个或多个数组。例子:

var水果=[“香蕉”,“橙色”];var moreFruits=[“苹果”、“芒果”、“柠檬”];var allFruits=水果.concat(更多水果);//子数组的值为:香蕉、橘子、苹果、芒果、柠檬
25

现在,你可以利用欧洲标准6语法和just do

设数组=[1,2];console.log([…数组,3]);

保持原始数组不变。

0
21

附加单个元素

//追加到末尾arrName.push('newName1');//开始前准备arrName.unshift('newName1');//在索引1处插入arrName.拼接(1,0,'newName1');//1:索引编号,0:要删除的元素编号,newName1:新元素//替换索引3(共个),否则添加新元素。arrName[3]='newName1';

附加多个元素

//从索引编号1插入arrName.splice(1,0,'newElemenet1','newElemenet2','newElemenet3');//1:插入起始的索引编号,//0:要删除的元素数,//newElemenet1,2,3:新元素

追加数组

//连接两个或多个数组arrName.concat(newAry1,newAry2);//newAry1、newAry2:将两个不同的数组组合(串联)到现有数组
  • 1
    为什么不呢?arrName.push('新元素1,新元素2,新元素3')? 评论 2018年8月12日16:12
  • 1
    在push()中,它在最后插入元素,但在我的例子中,它在中间插入元素,即从数组索引1(根据例子)@Mihail Malostanidis 评论 2018年8月12日17:27
  • 哦,我以为是这样的arrName(阵列名称)长度为1. 评论 2018年8月12日20:05
18

如果您正在使用欧洲标准6你可以使用传播操作员进行操作。

var arr=[“苹果”,“香蕉”,“樱桃”];var arr2=[“龙果”,“接骨木”,“无花果”];arr.push(…arr2);
17

如果你知道最高的索引(比如存储在变量“i”中),那么你可以

myArray[i+1]=someValue;

然而,如果你不知道,那么你可以使用

myArray.push(someValue);

如其他答案所示,或者您可以使用

myArray[myArray.length]=someValue;

注意,数组是从零开始的,所以.长度返回最高索引加一。

还要注意,您不必按顺序添加,实际上可以跳过值,如

myArray[myArray.length+1000]=someValue;

在这种情况下,中间的值将为未定义.

因此,在JavaScript中循环以验证某个值在该点实际存在时,这是一种很好的做法。

这可以通过以下方式实现:

if(myArray[i]===“未定义”){continue;}

如果您确定数组中没有任何零,则可以执行以下操作:

if(!myArray[i]){continue;}

当然,在这种情况下,请确保不要使用myArray[i]作为条件(正如互联网上的一些人建议的那样,只要大于最高索引,它将返回未定义其计算结果为).

1
  • 1
    你其实不是说“未定义”。必须为无效0!“未定义”是字符串,并且“未定义”!==无效0,因此您的if(myArray[i]为false,除非数组位于索引处设置为内容等效于的字符串'u'+'n'+'d'+'e'+'f'+'i'+''+''。还请注意,您不应使用未定义,改为使用无效0.因为无效0总是未定义的值,而未定义可以通过以下方式定义函数x(undefined){alert(undefine)}x(“hello world”),所以你不能确定是否有人意外设置窗口[“未定义”]=1或类似情况。
    – 蒂诺
    评论 2019年12月1日13:30
16

可以使用JavaScript实现排列运算符语法:

//初始化阵列var arr=[“嗨”,“你好”,“孟加拉国”];//向数组追加新值arr=[…arr,“Feni”];//或者可以添加变量值var testValue=“酷”;arr=[…arr,testValue];控制台.log(arr);//最终输出[“嗨”、“你好”、“孟加拉国”、“费尼”、“酷”]
2
  • 6
    这不会将值附加到数组中,这正是OP所要求的。这将创建一个新数组,其中包含旧数组和新元素的内容。实际上,这是Array.concat。 评论 2018年9月19日10:03
  • ES6的哪个功能特别重要?功能的(官方)名称是什么? 评论 2021年8月14日15:35
12

concat()当然,也可以用于二维数组。不需要循环。

变量a=[[1, 2],[3, 4] ];变量b=[[“a”、“b”],[“c”,“d”]];b=b.concat(a);警报(b[2][1]);//结果:2
11

只想添加一个片段,用于非破坏性地添加元素。

var newArr=oldArr.concat([newEl]);
11

让数组长度属性执行以下操作:

myarray[myarray.length]='添加到数组末尾的新元素值';

myarray.length返回数组中的字符串数。JavaScript是基于零的,因此数组的下一个元素键将是数组的当前长度。

例子:

var矩阵=[0,1,2,3],myarrayLength=myarray长度;//myarrayLength设置为4
0
9

将值附加到数组

数组原型.push将一个或多个元素添加到数组末尾,并返回数组的新长度,有时我们只想获得最新的新阵列,这样我们就可以这样做:

常数arr=[1,2,3];常数值=4;arr.concat([val]);//[1, 2, 3, 4]

或者只是:

[…arr,val]//[1,2,3,4]
1
  • 2
    使用ES6对休息操作员进行纠正。 评论 2018年6月7日21:49
6

附加单个项目

要将单个项附加到数组中,请使用推()Array对象提供的方法:

const水果=['banana','pear','apple']水果推送(“芒果”)console.log(水果)

push()改变原始数组。

要创建新阵列,请使用concat()数组方法:

const水果=['banana','pear','apple']const allfreets=水果.concat('mango')console.log(所有水果)

请注意concat()实际上并不向数组中添加项,而是创建一个新数组,您可以将其分配给另一个变量,或重新分配给原始数组(将其声明为,因为您无法重新分配常数):

const水果=['banana','pear','apple']const allfreets=水果.concat('mango')console.log(所有水果)
让水果=['banana','pear','apple']freests=水果.concat('mango')

附加多个项目

要将多个项附加到数组中,可以使用push()通过使用多个参数调用它:

const水果=['banana','pear','apple']水果。push(“芒果”、“甜瓜”、“鳄梨”)console.log(水果)

您也可以使用concat()方法,传递以逗号分隔的项目列表:

const水果=['banana','pear','apple']const allfreets=水果.concat('mango','we瓜','avocado')console.log(所有水果)

或数组:

const水果=['banana','pear','apple']const allfreests=水果.concat(['mango','甜瓜','鳄梨'])console.log(所有水果)

请记住,如前所述,此方法不会改变原始数组,但会返回一个新数组。

原来发布于

5

如果要组合两个数组而不重复,可以尝试以下代码:

array_merge=函数(arr1,arr2){返回arr1.concat(arr2.filter(函数(项)){return arr1.indexOf(item)<0;}))}

用法:

array1=['1','2','3']数组2=['2','3','4','5']combined_array=数组合并(数组1,数组2)

输出:

[1,2,3,4,5]

4

你在里面推了那个值。例子:array.push(值);

4

如果要将单个值附加到数组中,只需使用push方法。它将在数组末尾添加一个新元素。

但如果您打算添加多个元素,则将这些元素存储在一个新数组中,并将第二个数组与第一个数组连接起来。。。你想怎么做都行。

arr=['a','b','c'];arr.push(d');//现在在console.log中打印数组,它将包含'a'、'b'、'c'、'd'等元素。console.log(数组);

我们没有追加函数,但我们有取消移位。假设您有下面的数组:

var arr=[1,2,3,4,5];

我们想给这个数组附加一个值。我们可以做到arr.push(6),它将在数组末尾添加6:

arr.push(6);//返回[1,2,3,4,5,6];

我们还可以使用取消移位,看看我们如何应用它:

arr.unshift(0);//返回[0,1,2,3,4,5];

它们是向数组添加或附加新值的主要函数。

如果要添加值,可以使用push(),例如arr.push(“测试1”,“测试2”);.

如果你有数组,你可以使用concat(),例如。数组1.concat(数组2).

如果只有一个元素要添加,也可以尝试长度方法,例如。数组[aray.length]=“test”;.

2

在数组中追加项

让水果=[“桔子”,“香蕉”,“苹果”,“柠檬”];/*数组声明*/水果。push(“avacado”);/*向数组中添加元素*//*显示数组元素*/for(var i=0;i<水果长度;i++){console.log(水果[i]);}
1

您可以使用方法。

Array.prototype.append=函数(destArray){destArray=destArray||[];this.push.call(this,…destArray);返回此;}var arr=[1,2,5,67];var arr1=[7,4,7,8];console.log(arr.append(arr1));//[7, 4, 7, 8, 1, 4, 5, 67, 7]控制台.log(arr.append(“Hola”))//[1,2,5,67,7,4,7,8,“H”,“o”,“l”,“a”]
1
1

push()将新元素添加到数组的末尾。

pop()从数组末尾删除元素。

要将对象(如字符串或数字)附加到数组,请使用:

array.push(toAppend);

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.