Câu hỏi Làm thế nào để nối một cái gì đó vào một mảng?


Làm cách nào để thêm một đối tượng (chẳng hạn như một chuỗi hoặc số) vào một mảng trong JavaScript?


2880


gốc




Các câu trả lời:


Sử dụng push() để thêm vào một mảng:

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

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

console.log(arr);

Sẽ in

["Hi", "Hello", "Bonjour", "Hola"]

Bạn có thể dùng push() để nối nhiều hơn một giá trị vào một mảng trong một cuộc gọi duy nhất:

// 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]);
}

Sẽ in

Hi
Hello
Bonjour
Hola 
Salut
Hey

Cập nhật

Nếu bạn muốn thêm các mục của một mảng vào mảng khác, bạn có thể sử dụng firstArray.concat(secondArray):

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

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

console.log(arr);

Sẽ in

["apple", "banana", "cherry", "dragonfruit", "elderberry", "fig"]

3386



Lưu ý giá trị trả về của .push không phải là mảng (hoặc một mảng mới, như .concat), nhưng một số nguyên đại diện cho độ dài mới của mảng. - Jay
@RST: không sử dụng for ở tất cả (sử dụng .forEach). - Robert Siemer
Tôi muốn nói rằng mã ban đầu là tốt. Không cần gì để tối ưu hóa quyền truy cập vào length bất động sản. Người thông dịch làm một công việc tuyệt vời ở chính nó và nó sẽ không tạo ra bất kỳ sự khác biệt nào trong Thế giới thực cho dù bạn có tối ưu hóa nó hay không. Nếu mảng của bạn trở nên quá lớn để tối ưu hóa .length thực sự sẽ giúp đỡ, hầu hết có lẽ một mảng không phải là cấu trúc dữ liệu đúng nữa. Sử dụng forEachcó lợi thế của nó, nhưng nó rất nghi ngờ rằng tăng hiệu suất sẽ là một trong số họ, như các cuộc gọi chức năng cho mỗi iteration phải chịu một chi phí và tiết kiệm không có gì. - Stijn de Witt
@RobertSiemer The length tài sản của một mảng không được tính toán mỗi khi bạn gọi nó, đó là một biến được lưu trữ trong array đối tượng, chỉ được cập nhật khi bạn thay đổi mảng. Vì vậy, trên thực tế, không có chi phí hiệu suất bao gồm arr.length bên trong for điều kiện. - mikeyq6
@Mojimi Là người mới bắt đầu bỏ qua bất kỳ lời khuyên nào về câu hỏi hiệu suất trong các trường hợp cạnh như thế này. Sử dụng cú pháp biểu cảm hơn. Theo thời gian, các thời gian chạy Javascript thêm ngày càng nhiều tối ưu hóa - chúng sẽ nội tuyến forEach chức năng gọi lại (một số có thể đã làm điều đó) và sẽ không có sự khác biệt trong mã máy được tạo ra, nếu hàm được gọi thường xuyên đủ để được biên dịch thay vì được giải thích bởi thời gian chạy. Lời khuyên tương tự cũng giống như đối với bất kỳ ngôn ngữ nào không phải là người lắp ráp. - Mörre


Nếu bạn chỉ phụ thêm một biến, thì push() hoạt động tốt. Nếu bạn cần nối thêm một mảng khác, hãy sử dụng concat():

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

var ar3 = ar1.concat(ar2);

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

Sẽ nhổ ra:

"1,2,3"
"4,5,6"
"1,2,3,4,5,6"

Concat không ảnh hưởng ar1 và ar2 trừ khi được giao lại, ví dụ:

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

Sẽ hiển thị:

"1,2,3,4,5,6"

Rất nhiều thông tin tuyệt vời đây


954



Chỉ cần đảm bảo mọi người bắt được var ar3 = ar1.concat (ar2); phần. ar1.concat (ar2) không lưu các giá trị vào ar1. Bạn phải bắt nó bằng cách gán nó cho ar3 hoặc quay lại ar1, chẳng hạn như: ar1 = ar1.concat (ar2); - vbullinger
Tôi muốn nói đây là câu trả lời sai. Câu hỏi là How do I append to an array in JavaScript?, nhưng concat thực ra tạo ra một Mới mảng. Đó là một sự khác biệt quan trọng! Thay vào đó tôi muốn nói câu trả lời dưới đây bởi Omnimike thực sự là tốt nhất: Sử dụng Push.apply để đẩy toàn bộ mảng vào mảng hiện có mà không cần tạo mảng mới. - Stijn de Witt
@StijndeWitt bạn vẫn có thể nối thêm mà không tạo mảng mới, như đã nêu trong chú thích trước ar1 = ar1.concat(ar2); sẽ thêm vào ar1 - cameronjonesweb
@cameronjonesweb Trên thực tế, những gì nó làm là tạo ra một mảng mới với nội dung giống như ar1, thêm ar2 và sau đó trả về mảng mới. Chỉ cần bỏ qua phần chuyển nhượng (ar1 = ...) từ dòng mã đó và bạn sẽ thấy rằng nguyên  ar1 không thực sự thay đổi. Nếu bạn muốn tránh tạo một bản sao, bạn sẽ cần push. Đừng tin tôi, tin tài liệu: "Phương thức concat () trả về mảng mới" Câu đầu tiên trong tài liệu cho concat. - Stijn de Witt
@StijndeWitt Bạn nói đúng. Tuy nhiên, một cách khác để xem xét nó mặc dù, .push chỉ hoạt động tốt trong việc thêm các biến đơn / đối tượng, nhưng tuy nhiên sẽ gây rối khi nói đến chắp thêm mảng, ar2 ở trên là anyways. Kết quả của .push trong kịch bản sẽ là = [ar1, [ar2]]. .concat giải quyết vấn đề đó, nhưng với sự hy sinh của tốc độ và một mảng mới được tạo ra. Để sử dụng .push đúng trong mảng nối, lặp lại phần tử đã chứa trước và đẩy từng phần tử. ar2.forEach(each => { ar1.push(each); }); - Ade


Một số điểm chuẩn nhanh (mỗi thử nghiệm = 500k phần tử được nối thêm và kết quả là trung bình của nhiều lần chạy) cho thấy như sau:

Firefox 3.6 (Mac):

  • Các mảng nhỏ: arr[arr.length] = b nhanh hơn (300 m so với 800 mili giây)
  • Các mảng lớn: arr.push(b) nhanh hơn (500 mili giây so với 900 mili giây)

Safari 5.0 (Mac):

  • Các mảng nhỏ: arr[arr.length] = b nhanh hơn (90 mili giây so với 115 mili giây)
  • Các mảng lớn: arr[arr.length] = b nhanh hơn (160 mili giây so với 185 mili giây)

Google Chrome 6.0 (Mac):

  • Các mảng nhỏ: Không có sự khác biệt đáng kể (và Chrome nhanh chóng! Chỉ ~ 38ms !!)
  • Các mảng lớn: Không có sự khác biệt đáng kể (160 mili giây)

Tôi thích arr.push() cú pháp tốt hơn, nhưng tôi nghĩ tôi sẽ tốt hơn với arr[arr.length] Phiên bản, ít nhất là ở tốc độ thô. Tôi rất muốn nhìn thấy kết quả của một trình duyệt IE mặc dù.


Các vòng đo điểm chuẩn của tôi:

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;
    }
}

370



Câu hỏi đặt ra là nếu .length là giá trị được lưu trữ hoặc được tính khi được truy cập, vì nếu giá trị sau đúng thì có thể sử dụng biến đơn giản (chẳng hạn như j) vì giá trị chỉ mục có thể nhanh hơn - yoel halb
1 cho statics, Làm thế nào để bạn thực hiện những điểm chuẩn? - mko
@yozloy: jsperf.com là bạn của bạn :) - Jens Roland
Loại điểm chuẩn này là thú vị, nhưng trớ trêu thay không phải là rất hữu ích trong việc làm cho các ứng dụng nhanh hơn. Vòng lặp kết xuất tốn kém hơn nhiều trong bất kỳ chu kỳ nào. Ngoài ra, các bên trong của ngôn ngữ JS này liên tục được tối ưu hóa bởi các nhà phát triển trình duyệt. Thats lý do cho downvote của tôi, không phải là sự thú vị của câu trả lời này. Nếu bạn muốn ứng dụng nhanh hơn, điểm chuẩn đầu tiên và xem những gì cần thay đổi - 99 trong số 100 lần, nó sẽ không phải là vấn đề như thử nghiệm này cho thấy. Thường thì nhà phát triển kém của nó JS / CSS - không phải là trình duyệt nội bộ đang làm cho nó chậm. - LessQuesar
Tôi đồng ý với LessQuesar khi gắn bó với nội trang bất cứ khi nào có thể. Không phải là tối ưu hóa vi mô là xấu trong chính nó, nhưng anh ta đúng rằng các trình duyệt luôn cải thiện tốc độ động cơ của họ. Trường hợp tại điểm: như của văn bản này, hiệu suất cho mỗi trình duyệt gần như giống hệt nhau cho tất cả các kỹ thuật được liệt kê ở trên. Có nghĩa là rất nhiều fuss một vài năm trước đây cho một lợi ích nhỏ như vậy, khi bây giờ không có được. - Beejor


Tôi nghĩ rằng nó đáng nói đến là push có thể được gọi với nhiều đối số, nó sẽ được nối vào mảng theo thứ tự. Ví dụ:

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

Kết quả là bạn có thể sử dụng push.apply để nối một mảng vào mảng khác như sau:

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

ES5 được chú giải có thêm thông tin về chính xác những gì đẩy và ứng dụng làm.

Cập nhật năm 2016: với Lan tràn, bạn không cần điều đó apply nữa, như:

arr.push(...['fourth', 'fifth']);
console.log(arr) // ['first', 'second', 'third', 'fourth', 'fifth']

260



câu trả lời tốt nhất để nối thêm một mảng các mục trong khi không tạo mảng mới. - Gabriel Littman
@GabrielLittman Đặc biệt bởi vì phụ thêm vào một mảng, IMHO, nên sửa đổi mảng, không tạo một mảng mới. - Juan Mendes
Tôi thích phiên bản push.apply, thay vì sử dụng Array.prototype.push.apply() Tuy nhiên. - Michael
Đôi khi điều quan trọng là bảo toàn tham chiếu đến một mảng - ví dụ trong AngularJs khi một mảng nằm trong phạm vi trên một số bộ điều khiển và một số dịch vụ cần cập nhật dữ liệu trong mảng để hiển thị. Đó là lý do tại sao tôi upvoting giải pháp này. - see sharper


Bạn có thể dùng push và apply để nối hai mảng.

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

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

Nó sẽ nối thêm array2 đến array1. Hiện nay array1 chứa đựng [11, 32, 75, 99, 67, 34]. Mã này đơn giản hơn nhiều so với viết for các vòng lặp để sao chép mỗi và mọi mục trong mảng.


64



Đây là những gì tôi yêu cầu, duy trì tham khảo mảng ban đầu - amit bakle


Sử dụng concat:

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

a bây giờ chứa tất cả các phần tử, [1, 2, 3, 3, 4, 5].

Tài liệu tham khảo: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat


35





Nếu arr là một mảng và val là giá trị bạn muốn thêm vào:

arr.push(val);

Ví dụ.

arr = ['a', 'b', 'c'];
arr.push('d');
console.log(arr);

sẽ đăng nhập:

['a', 'b', 'c', 'd']

34