如何将某些内容附加到数组?

IT技术 javascript arrays append
2021-02-03 23:42:13

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

6个回答

使用该Array.prototype.push方法将值附加到数组的末尾:

// initialize array
var arr = [
  "Hi",
  "Hello",
  "Bonjour"
];

// append new value to the array
arr.push("Hola");

console.log(arr);


您可以使用该push()函数在一次调用中将多个值附加到数组中:

// initialize array
var arr = ["Hi", "Hello", "Bonjour", "Hola"];

// append multiple values to the array
arr.push("Salut", "Hey");

// display all values
for (var i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}


更新

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

var arr = [
  "apple",
  "banana",
  "cherry"
];

arr = arr.concat([
  "dragonfruit",
  "elderberry",
  "fig"
]);

console.log(arr);

更新

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

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

它还支持像push.


更新

ES6语法的另一种方法是使用扩展语法返回一个新数组这使原始数组保持不变,但返回一个附加了新项的新数组,符合函数式编程的精神。

const arr = [
  "Hi",
  "Hello",
  "Bonjour",
];

const newArr = [
  ...arr,
  "Salut",
];

console.log(newArr);

请注意 .push 的返回值不是数组(或新的数组,如 .concat),而是表示数组新长度的整数。
2021-03-09 23:42:13

如果你只附加一个变量,那么push()工作得很好。如果您需要附加另一个数组,请使用concat()

var ar1 = [1, 2, 3];
var ar2 = [4, 5, 6];

var ar3 = ar1.concat(ar2);

alert(ar1);
alert(ar2);
alert(ar3);

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

var ar1 = [1, 2, 3];
var ar2 = [4, 5, 6];

ar1 = ar1.concat(ar2);
alert(ar1);

JavaScript 参考中有很多很好的信息

我会说这实际上是错误的答案。问题是How do I append to an array in JavaScript?,但concat实际上创建了一个数组。这是一个重要的区别!相反,我认为 Omnimike 下面的答案实际上是最好的答案:使用Push.apply将整个数组推送到现有数组,而无需创建新数组。
2021-03-11 23:42:13
@StijndeWitt 你是对的。但是,以不同的方式看待它, .push 仅适用于添加单个变量/对象,但在附加数组时会混乱,ar2无论如何都是如此。.push场景中的结果将是= [ar1, [ar2]].concat 解决了这个问题,但牺牲了速度并创建了一个新数组。.push在数组追加中正确使用,请先循环出包含的元素并推送每个元素。ar2.forEach(each => { ar1.push(each); });
2021-03-11 23:42:13
@StijndeWitt 您仍然可以在不创建新数组的情况下追加,如前一条评论中所述,ar1 = ar1.concat(ar2);将追加到ar1
2021-03-19 23:42:13
只是确保人们捕捉到 var ar3 = ar1.concat(ar2); 部分。ar1.concat(ar2) 不会将值保存到 ar1 中。您必须通过将其分配给 ar3 或返回给 ar1 来捕获它,例如: ar1 = ar1.concat(ar2);
2021-03-27 23:42:13
@cameronjonesweb 实际上,它所做的是创建一个与 内容相同的新数组ar1,追加ar2然后返回新数组。只需ar1 = ...从该行代码中省略赋值部分 ( ),您就会看到原来 的代码ar1实际上并没有改变。如果您想避免复制,则需要push. 不相信我,相信文档:“concat() 方法返回一个新数组”文档中的第一句话concat
2021-04-04 23:42:13

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

火狐 3.6 (Mac):

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

Safari 5.0 (Mac):

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

谷歌浏览器 6.0(苹果机):

  • 小数组:没有显着差异(Chrome 速度很快!只有 ~38ms !!)
  • 大型阵列:无显着差异(160ms)

我更喜欢arr.push()语法,但我认为我会更好地使用arr[arr.length]版本,至少在原始速度方面。不过,我很想看看 IE 运行的结果。


我的基准测试循环:

function arrpush_small() {
    var arr1 = [];
    for (a = 0; a < 100; a++)
    {
        arr1 = [];
        for (i = 0; i < 5000; i++)
        {
            arr1.push('elem' + i);
        }
    }
}

function arrlen_small() {
    var arr2 = [];
    for (b = 0; b < 100; b++)
    {
        arr2 = [];
        for (j = 0; j < 5000; j++)
        {
            arr2[arr2.length] = 'elem' + j;
        }
    }
}


function arrpush_large() {
    var arr1 = [];
    for (i = 0; i < 500000; i++)
    {
        arr1.push('elem' + i);
    }
}

function arrlen_large() {
    var arr2 = [];
    for (j = 0; j < 500000; j++)
    {
        arr2[arr2.length] = 'elem' + j;
    }
}
我同意 LessQuesar 尽可能坚持内置函数。并不是说微优化本身就不好,但是浏览器总是在提高它们的引擎速度是对的。举个例子:在撰写本文时,对于上面列出的所有技术,每个浏览器的性能几乎相同。意思是几年前为了这么小的收益大惊小怪,现在没有收益。
2021-03-09 23:42:13
这种类型的基准测试很有趣,但具有讽刺意味的是,它对加快应用程序的速度并不是很有帮助。渲染循环在任何循环中都要贵得多。此外,浏览器开发人员正在不断优化 JS 语言的这些内部结构。这就是我投反对票的原因,而不是这个答案的有趣性。如果您想要更快的应用程序,请先进行基准测试并查看要更改的内容 - 100 次中有 99 次不会像此测试显示的那样出现问题。通常是它糟糕的开发人员 JS/CSS - 不是浏览器内部导致它变慢。
2021-03-21 23:42:13
我想知道这在过去四年中发生了多大的变化。(jsperf 现在会很方便。)
2021-03-25 23:42:13
问题是 .length 是存储值还是在访问时计算,因为如果后者为真,那么使用简单变量(例如 j)作为索引值可能会更快
2021-04-03 23:42:13
希望在同一个测试中看到 concat() !
2021-04-03 23:42:13

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

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

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

var arr = ['first'];
arr.push('second', 'third');
arr.push.apply(arr, ['forth', 'fifth']);
console.log(arr);

带注释的 ES5有更多关于pushapply 的确切作用的信息

2016 年更新:使用spread,您不再需要它apply,例如:

var arr = ['first'];
arr.push('second', 'third');

arr.push(...['fourth', 'fifth']);
console.log(arr) ;

在不创建新数组的情况下附加项目数组的最佳答案。
2021-03-09 23:42:13
我喜欢 push.apply 版本,但宁愿使用Array.prototype.push.apply()
2021-04-03 23:42:13
@GabrielLittman 特别是因为附加到数组,恕我直言,应该修改数组,而不是创建一个新数组。
2021-04-05 23:42:13
有时保留对数组的引用很重要 - 例如在 AngularJs 中,当数组在某个控制器的范围内并且某些服务需要更新数组中的数据以进行显示时。这就是为什么我赞成这个解决方案。
2021-04-07 23:42:13

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

var array1 = [11, 32, 75];
var array2 = [99, 67, 34];

Array.prototype.push.apply(array1, array2);
console.log(array1);

它将附加array2array1. 现在array1包含[11, 32, 75, 99, 67, 34]. 这段代码比编写for循环来复制数组中的每一项要简单得多

这就是我所需要的,保持原始数组引用
2021-04-01 23:42:13
如果您使用的是 ES6/7,您还可以使用...操作符代替应用 const a1 = [] const a2 = [5,6,7] const.push(...a2) 编辑:语法高亮
2021-04-04 23:42:13
我会array1.concat(array2)在这种情况下使用调用push似乎没有必要。
2021-04-07 23:42:13