Cách nhanh nhất để sao chép một mảng trong JavaScript - vòng lặp so với 'cho'


634

Để sao chép một mảng trong JavaScript: cách nào sau đây là nhanh hơn để sử dụng?

Phương pháp cắt lát

var dup_array = original_array.slice();

For vòng

for(var i = 0, len = original_array.length; i < len; ++i)
   dup_array[i] = original_array[i];

Tôi biết cả hai cách chỉ làm một bản sao nông : nếu original_array chứa tham chiếu đến các đối tượng, các đối tượng sẽ không được sao chép, nhưng chỉ các tham chiếu sẽ được sao chép và do đó cả hai mảng sẽ có tham chiếu đến cùng các đối tượng. Nhưng đây không phải là điểm của câu hỏi này.

Tôi chỉ hỏi về tốc độ.


3
jsben.ch/#/wQ9RU <= điểm chuẩn cho các cách phổ biến nhất để sao chép một mảng
EscapeNetscape

Câu trả lời:


776

Có ít nhất 5 cách (!) Để sao chép một mảng:

  • vòng
  • lát
  • Mảng.from ()
  • concat
  • toán tử trải rộng (FASTEST)

Đã có một chủ đề LỢI ÍCH huuuge , cung cấp thông tin sau:

  • đối với các trình duyệt nhấp nháyslice() là phương pháp nhanh nhất, concat()chậm hơn một chút và while loopchậm hơn 2,4 lần.

  • đối với các trình duyệt khác while looplà phương pháp nhanh nhất, vì các trình duyệt đó không có tối ưu hóa nội bộ cho sliceconcat.

Điều này vẫn đúng trong tháng 7 năm 2016.

Dưới đây là các tập lệnh đơn giản mà bạn có thể sao chép-dán vào bảng điều khiển của trình duyệt và chạy nhiều lần để xem ảnh. Họ xuất ra mili giây, thấp hơn là tốt hơn.

trong khi lặp lại

n = 1000*1000;
start = + new Date();
a = Array(n); 
b = Array(n); 
i = a.length;
while(i--) b[i] = a[i];
console.log(new Date() - start);

lát

n = 1000*1000;
start = + new Date();
a = Array(n); 
b = a.slice();
console.log(new Date() - start);

Xin lưu ý rằng các phương thức này sẽ sao chép chính đối tượng Array, tuy nhiên nội dung mảng được sao chép bằng tham chiếu và không được nhân bản sâu.

origAr == clonedArr //returns false
origAr[0] == clonedArr[0] //returns true

48
@ cept0 không có cảm xúc, chỉ là điểm chuẩn jsperf.com/new-array-vs-splice-vs-slice/31
Dan

2
@Dan Vậy là sao? Kết quả thử nghiệm của bạn: Firefox 30 mỗi đêm vẫn nhanh hơn ~ 230% so với Chrome. Kiểm tra mã nguồn của V8 splicevà bạn sẽ ngạc nhiên (trong khi ...)
mate64

4
Đáng buồn thay cho các mảng ngắn, câu trả lời là rất khác nhau . Ví dụ, nhân bản một mảng người nghe trước khi gọi từng người trong số họ. Những mảng thường nhỏ, thường là 1 phần tử.
gman

6
Bạn đã bỏ lỡ phương pháp này:A.map(function(e){return e;});
wcochran

13
Bạn đang viết về các trình duyệt nhấp nháy . Là không chớp mắt chỉ là một động cơ bố trí, chủ yếu ảnh hưởng đến vẽ HTML, và do đó không quan trọng? Tôi nghĩ rằng chúng ta muốn nói về V8, Spidermonkey và bạn bè ở đây. Chỉ là một điều làm tôi bối rối. Hãy soi sáng cho tôi, nếu tôi sai.
Sơ sinh

242

Kỹ thuật slice cách nhanh nhất. Tuy nhiên , nó thậm chí còn nhanh hơn nếu bạn thêm 0chỉ mục bắt đầu.

myArray.slice(0);

nhanh hơn

myArray.slice();

http://jsperf.com/claming-arrays/3


Và có myArray.slice(0,myArray.length-1);nhanh hơn myArray.slice(0);không?
jave.web

1
@ jave.web bạn; vừa bỏ phần tử cuối cùng của mảng. Bản sao đầy đủ là mảng.slice (0) hoặc mảng.slice (0, mảng.length)
Marek Marczak

137

Cách es6 thì sao?

arr2 = [...arr1];

23
nếu được chuyển đổi với babel:[].concat(_slice.call(arguments))
CHAN

1
Không chắc chắn argumentsđến từ đâu ... Tôi nghĩ rằng sản lượng babel của bạn đang kết hợp một vài tính năng khác nhau. Nó có nhiều khả năng là như vậy arr2 = [].concat(arr1).
Sterling Archer

3
@SterlingArcher arr2 = [].conact(arr1)khác với arr2 = [...arr1]. [...arr1]cú pháp sẽ chuyển lỗ thành undefined. Ví dụ , arr1 = Array(1); arr2 = [...arr1]; arr3 = [].concat(arr1); 0 in arr2 !== 0 in arr3.
tsh

1
Tôi đã thử nghiệm điều này trong trình duyệt của mình (Chrome 59.0.3071.115) dựa trên câu trả lời của Dan ở trên. Nó chậm hơn 10 lần so với .slice (). n = 1000*1000; start = + new Date(); a = Array(n); b = [...a]; console.log(new Date() - start); // 168
Harry Stevens

1
Vẫn sẽ không sao chép một cái gì đó như thế này : [{a: 'a', b: {c: 'c'}}]. Nếu cgiá trị của thay đổi trong mảng "trùng lặp", nó sẽ thay đổi trong mảng ban đầu, vì đó chỉ là một bản sao tham chiếu, không phải là bản sao.
Chất dẫn truyền thần kinh

44

Cách dễ nhất để sao chép sâu Array hoặc Object:

var dup_array = JSON.parse(JSON.stringify(original_array))

56
Lưu ý quan trọng cho người mới bắt đầu: bởi vì điều này phụ thuộc vào JSON, điều này cũng thừa hưởng những hạn chế của nó. Trong số những thứ khác, điều đó có nghĩa là mảng của bạn không thể chứa undefinedhoặc bất kỳ functions. Cả hai sẽ được chuyển đổi nullcho bạn trong JSON.stringifyquá trình. Các chiến lược khác, chẳng hạn như (['cool','array']).slice()sẽ không thay đổi chúng nhưng cũng không làm sâu sắc các đối tượng trong mảng. Thế là có sự đánh đổi.
Seth Holladay

27
Rất tệ và không hoạt động với các đối tượng đặc biệt như DOM, date, regrec, function ... hoặc các đối tượng được tạo nguyên mẫu. Không hỗ trợ tài liệu tham khảo theo chu kỳ. Bạn không bao giờ nên sử dụng JSON cho bản sao sâu.
Yukulélé

17
cách tồi tệ nhất có thể! Chỉ sử dụng nếu đối với một số vấn đề khác không hoạt động. Nó chậm, tài nguyên rất mãnh liệt và nó có tất cả các giới hạn JSON đã được đề cập trong các bình luận. Không thể tưởng tượng làm thế nào nó có 25 phiếu bầu.
Lukas Liesis

2
Nó sao chép sâu các mảng với các nguyên hàm và trong đó các thuộc tính là các mảng với các nguyên hàm / mảng tiếp theo. Cho rằng nó là ok.
Drenai

4
Tôi đã thử nghiệm điều này trong trình duyệt của mình (Chrome 59.0.3071.115) dựa trên câu trả lời của Dan ở trên. Nó chậm hơn gần 20 lần so với .slice (). n = 1000*1000; start = + new Date(); a = Array(n); var b = JSON.parse(JSON.stringify(a)) console.log(new Date() - start); // 221
Harry Stevens

29
var cloned_array = [].concat(target_array);

3
Hãy giải thích những gì nó làm.
Jed Fox

8
Mặc dù đoạn mã này có thể trả lời câu hỏi, nó không cung cấp bất kỳ ngữ cảnh nào để giải thích làm thế nào hoặc tại sao. Xem xét thêm một hoặc hai câu để giải thích câu trả lời của bạn.
brandonscript

32
Tôi ghét loại ý kiến ​​này. Đó là hiển nhiên những gì nó làm!
EscapeNetscape

6
Một câu trả lời đơn giản cho một câu hỏi đơn giản, không có câu chuyện lớn để đọc. Tôi thích loại câu trả lời +1
Achim

15
"Tôi chỉ hỏi về tốc độ" - Câu trả lời này không đưa ra dấu hiệu nào về tốc độ. Đó là câu hỏi chính đang được hỏi. brandonscript có một điểm tốt. Cần thêm thông tin để xem đây là một câu trả lời. Nhưng nếu đó là một câu hỏi đơn giản hơn, đây sẽ là một câu trả lời tuyệt vời.
TamusJRoyce

26

Tôi đưa ra một bản demo nhanh: http://jsbin.com/agugo3/edit

Kết quả của tôi trên Internet Explorer 8 là 156, 782 và 750, điều này cho thấy sẽ slicenhanh hơn nhiều trong trường hợp này.


Đừng quên chi phí bổ sung của người thu gom rác nếu bạn phải làm việc này rất nhanh. Tôi đã sao chép từng mảng lân cận cho mỗi ô trong automata di động của mình bằng cách sử dụng lát cắt và nó chậm hơn nhiều so với việc sử dụng lại một mảng trước đó và sao chép các giá trị. Chrome chỉ ra khoảng 40% tổng thời gian dành cho việc thu gom rác.
Drainke7707

21

a.map(e => e)là một lựa chọn khác cho công việc này. Tính đến hôm nay .map()là rất nhanh (gần như nhanh như.slice(0) ) trong Firefox, nhưng không phải trong Chrome.

Mặt khác, nếu một mảng là đa chiều, vì các mảng là các đối tượng và các đối tượng là các kiểu tham chiếu, thì không có phương thức lát hoặc concat nào có thể chữa được ... Vì vậy, một cách nhân bản một mảng là một phát minh Array.prototype.clone()như sau

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};

var arr = [ 1, 2, 3, 4, [ 1, 2, [ 1, 2, 3 ], 4 , 5], 6 ],
    brr = arr.clone();
brr[4][2][1] = "two";
console.log(JSON.stringify(arr));
console.log(JSON.stringify(brr));


Không tệ, nhưng thật không may, điều này không hoạt động nếu bạn có Object trong mảng của mình: \ JSON.parse (JSON.opesify (myArray)) hoạt động tốt hơn trong trường hợp này.
GBMan

17

Way Cách nhanh nhất để sao chép một mảng

Tôi đã thực hiện chức năng tiện ích rất đơn giản này để kiểm tra thời gian cần thiết để sao chép một mảng. Nó không đáng tin cậy 100% tuy nhiên nó có thể cung cấp cho bạn một ý tưởng lớn về thời gian cần thiết để sao chép một mảng hiện có:

function clone(fn) {
    const arr = [...Array(1000000)];
    console.time('timer');
    fn(arr);
    console.timeEnd('timer');
}

Và thử nghiệm phương pháp khác nhau:

1)   5.79ms -> clone(arr => Object.values(arr));
2)   7.23ms -> clone(arr => [].concat(arr));
3)   9.13ms -> clone(arr => arr.slice());
4)  24.04ms -> clone(arr => { const a = []; for (let val of arr) { a.push(val); } return a; });
5)  30.02ms -> clone(arr => [...arr]);
6)  39.72ms -> clone(arr => JSON.parse(JSON.stringify(arr)));
7)  99.80ms -> clone(arr => arr.map(i => i));
8) 259.29ms -> clone(arr => Object.assign([], arr));
9) Maximum call stack size exceeded -> clone(arr => Array.of(...arr));

CẬP NHẬT :
Lưu ý: trong số tất cả, cách duy nhất để sao chép sâu một mảng là sử dụng JSON.parse(JSON.stringify(arr)).

Điều đó nói rằng, không sử dụng ở trên nếu mảng của bạn có thể bao gồm các hàm vì nó sẽ trả về null.
Cảm ơn bạn @GilEpshtain cho bản cập nhật này .


2
Tôi đã thử điểm chuẩn câu trả lời của bạn và tôi nhận được kết quả rất khác nhau: jsben.ch/o5nLG
mesqueeb

@mesqueeb, các bài kiểm tra có thể thay đổi, tùy thuộc vào máy của bạn. Tuy nhiên, hãy thoải mái cập nhật câu trả lời với kết quả kiểm tra của bạn. Công việc tốt đẹp!
Lior Elrom

Tôi thích câu trả lời của bạn rất nhiều, tuy nhiên tôi thử bài kiểm tra của bạn và nhận được đó arr => arr.slice()là cách nhanh nhất.
Gil Epshtain

1
@LiorElrom, bản cập nhật của bạn không chính xác, do thực tế là các phương thức không được tuần tự hóa. Ví dụ: JSON.parse(JSON.stringify([function(){}]))sẽ xuất[null]
Gil Epshtain

1
Điểm chuẩn đẹp. Tôi đã thử nghiệm điều này trên máy Mac của mình trong 2 trình duyệt: Chrome Phiên bản 81.0.4044.113 và Safari Phiên bản 13.1 (15609.1.20.111.8) và nhanh nhất là hoạt động trải rộng: [...arr]với 4.653076171875msChrome và 8.565mstrong Safari. Nhanh thứ hai trong Chrome là chức năng lát arr.slice()với 6.162109375msvà trong Safari thứ hai là [].concat(arr)với 13.018ms.
edufinn

7

Hãy xem: liên kết . Đó không phải là về tốc độ, mà là sự thoải mái. Ngoài ra, như bạn có thể thấy, bạn chỉ có thể sử dụng lát (0) trên các kiểu nguyên thủy .

Để tạo một bản sao độc lập của một mảng chứ không phải là một bản sao của sự tinh chỉnh cho nó, bạn có thể sử dụng phương pháp lát mảng.

Thí dụ:

Để tạo một bản sao độc lập của một mảng chứ không phải là một bản sao của sự tinh chỉnh cho nó, bạn có thể sử dụng phương pháp lát mảng.

var oldArray = ["mip", "map", "mop"];
var newArray = oldArray.slice();

Để sao chép hoặc sao chép một đối tượng:

function cloneObject(source) {
    for (i in source) {
        if (typeof source[i] == 'source') {
            this[i] = new cloneObject(source[i]);
        }
        else{
            this[i] = source[i];
  }
    }
}

var obj1= {bla:'blabla',foo:'foofoo',etc:'etc'};
var obj2= new cloneObject(obj1);

Nguồn: liên kết


1
Các loại nguyên thủy bình luận áp dụng cho forvòng lặp trong câu hỏi là tốt.
dùng113716

4
nếu tôi đang sao chép một mảng các đối tượng, tôi sẽ mong đợi mảng mới tham chiếu cùng các đối tượng thay vì nhân bản các đối tượng.
lincolnk

7

Như @ Dan nói: "Câu trả lời này trở nên lỗi thời nhanh chóng sử dụng. Benchmarks để kiểm tra tình hình thực tế", có một câu trả lời từ cụ thể jsperf rằng đã không có một câu trả lời cho chính nó: trong khi :

var i = a.length;
while(i--) { b[i] = a[i]; }

có 960,589 ops / giây với vị trí á quân a.concat() ở mức 578.129 ops / giây, chiếm 60%.

Đây là Firefox (40) 64 bit mới nhất.


@aleclarson tạo ra một điểm chuẩn mới, đáng tin cậy hơn.


1
Bạn thực sự cần liên kết các jsperf. Cái bạn đang nghĩ bị hỏng, bởi vì một mảng mới được tạo trong mọi trường hợp thử nghiệm, ngoại trừ thử nghiệm 'vòng lặp while'.
aleclarson

1
Tôi đã tạo một jsperf mới chính xác hơn: jsperf.com/clone-array-3
aleclarson

60% là gì? Nhanh hơn 60%?
Peter Mortensen

1
@PeterMortensen: 587192 là ~ 60% (61.1 ...) của 960589.
-inc

7

Cách ECMAScript 2015 với Spreadnhà điều hành:

Ví dụ cơ bản:

var copyOfOldArray = [...oldArray]
var twoArraysBecomeOne = [...firstArray, ..seccondArray]

Thử trong bảng điều khiển trình duyệt:

var oldArray = [1, 2, 3]
var copyOfOldArray = [...oldArray]
console.log(oldArray)
console.log(copyOfOldArray)

var firstArray = [5, 6, 7]
var seccondArray = ["a", "b", "c"]
var twoArraysBecomOne = [...firstArray, ...seccondArray]
console.log(twoArraysBecomOne);

Người giới thiệu


Có lẽ điều duy nhất nhanh chóng với sự lây lan là gõ nó. Đó là waaay ít hiệu suất hơn so với các cách làm khác.
Xt_Nova

3
Vui lòng cung cấp một số liên kết về đối số của bạn.
Marian07

6

Nó phụ thuộc vào trình duyệt. Nếu bạn xem trong bài đăng trên blog Array.prototype.slice so với việc tạo mảng thủ công , có một hướng dẫn sơ bộ về hiệu suất của từng bài:

Nhập mô tả hình ảnh ở đây

Các kết quả:

Nhập mô tả hình ảnh ở đây


1
argumentskhông phải là một mảng hợp lý và ông sử dụng callđể buộc sliceđể chạy trên bộ sưu tập. kết quả có thể sai lệch.
lincolnk

Yeh tôi muốn đề cập rằng trong bài viết của tôi rằng các số liệu thống kê này có thể sẽ thay đổi ngay bây giờ với các broswers được cải thiện, nhưng nó đưa ra một ý tưởng chung.
kyndigs

2
@dirifde Tôi nghĩ rằng tình huống duy nhất mà việc đăng mã dưới dạng hình ảnh có thể được chấp nhận là khi mã có khả năng nguy hiểm và không nên được sao chép. Trong trường hợp này, nó khá vô lý.
Florian Wendelborn

6

Có một giải pháp sạch hơn nhiều:

var srcArray = [1, 2, 3];
var clonedArray = srcArray.length === 1 ? [srcArray[0]] : Array.apply(this, srcArray);

Kiểm tra độ dài là bắt buộc, bởi vì hàm Arraytạo hoạt động khác nhau khi nó được gọi với chính xác một đối số.


2
Nhưng nó có phải là nhanh nhất?
Chris Wesseling

14
Nhiều ngữ nghĩa hơn splice(), có lẽ. Nhưng thực sự, áp dụngđây là tất cả nhưng trực quan.
Michael Piefel

hiển thị hiệu suất chậm nhất trên chrome- jsperf.com/new-array-vs-splice-vs-slice/113
chrismarx

3
Bạn có thể sử dụng Array.ofvà bỏ qua độ dài:Array.of.apply(Array, array)
Oriol

6

Hãy nhớ .slice () sẽ không hoạt động cho mảng hai chiều. Bạn sẽ cần một chức năng như thế này:

function copy(array) {
  return array.map(function(arr) {
    return arr.slice();
  });
}

3
Trong Javascript không có mảng hai chiều. Chỉ có mảng chứa mảng. Những gì bạn đang cố gắng làm là một bản sao sâu mà không bắt buộc trong câu hỏi.
Aloso

5

Nó phụ thuộc vào độ dài của mảng. Nếu độ dài mảng là <= 1.000.000, thì các phương thức sliceconcatsẽ mất khoảng thời gian tương tự. Nhưng khi bạn đưa ra một phạm vi rộng hơn,concat phương pháp thắng.

Ví dụ: thử mã này:

var original_array = [];
for(var i = 0; i < 10000000; i ++) {
    original_array.push( Math.floor(Math.random() * 1000000 + 1));
}

function a1() {
    var dup = [];
    var start = Date.now();
    dup = original_array.slice();
    var end = Date.now();
    console.log('slice method takes ' + (end - start) + ' ms');
}

function a2() {
    var dup = [];
    var start = Date.now();
    dup = original_array.concat([]);
    var end = Date.now();
    console.log('concat method takes ' + (end - start) + ' ms');
}

function a3() {
    var dup = [];
    var start = Date.now();
    for(var i = 0; i < original_array.length; i ++) {
        dup.push(original_array[i]);
    }
    var end = Date.now();
    console.log('for loop with push method takes ' + (end - start) + ' ms');
}

function a4() {
    var dup = [];
    var start = Date.now();
    for(var i = 0; i < original_array.length; i ++) {
        dup[i] = original_array[i];
    }
    var end = Date.now();
    console.log('for loop with = method takes ' + (end - start) + ' ms');
}

function a5() {
    var dup = new Array(original_array.length)
    var start = Date.now();
    for(var i = 0; i < original_array.length; i ++) {
        dup.push(original_array[i]);
    }
    var end = Date.now();
    console.log('for loop with = method and array constructor takes ' + (end - start) + ' ms');
}

a1();
a2();
a3();
a4();
a5();

Nếu bạn đặt độ dài của original_array thành 1.000.000, slicephương thức vàconcat phương thức sẽ mất khoảng cùng thời gian (3-4 ms, tùy thuộc vào các số ngẫu nhiên).

Nếu bạn đặt độ dài của original_array thành 10.000.000, thì slicephương thức sẽ mất hơn 60 ms và concatphương thức này mất hơn 20 ms.


dup.pushsai a5, thay vào đó dup[i] = nên được sử dụng
4esn0k

3

Một giải pháp đơn giản:

original = [1,2,3]
cloned = original.map(x=>x)

2
        const arr = ['1', '2', '3'];

         // Old way
        const cloneArr = arr.slice();

        // ES6 way
        const cloneArrES6 = [...arr];

// But problem with 3rd approach is that if you are using muti-dimensional 
 // array, then only first level is copied

        const nums = [
              [1, 2], 
              [10],
         ];

        const cloneNums = [...nums];

// Let's change the first item in the first nested item in our cloned array.

        cloneNums[0][0] = '8';

        console.log(cloneNums);
           // [ [ '8', 2 ], [ 10 ], [ 300 ] ]

        // NOOooo, the original is also affected
        console.log(nums);
          // [ [ '8', 2 ], [ 10 ], [ 300 ] ]

Vì vậy, để tránh những tình huống này xảy ra, hãy sử dụng

        const arr = ['1', '2', '3'];

        const cloneArr = Array.from(arr);

Đó là một điều hợp lệ để chỉ ra cách thay đổi cloneNums[0][0]trong ví dụ của bạn đã truyền bá sự thay đổi đó nums[0][0]- nhưng đó là bởi vì đó thực sự nums[0][0]là một đối tượng có tham chiếu được sao chép cloneNumsbởi toán tử trải. Tất cả điều đó có nghĩa là, hành vi này sẽ không ảnh hưởng đến mã nơi chúng tôi đang sao chép theo giá trị (int, chuỗi, v.v.).
MP Aditya

1

Điểm chuẩn thời gian!

function log(data) {
  document.getElementById("log").textContent += data + "\n";
}

benchmark = (() => {
  time_function = function(ms, f, num) {
    var z = 0;
    var t = new Date().getTime();
    for (z = 0;
      ((new Date().getTime() - t) < ms); z++)
      f(num);
    return (z)
  }

  function clone1(arr) {
    return arr.slice(0);
  }

  function clone2(arr) {
    return [...arr]
  }

  function clone3(arr) {
    return [].concat(arr);
  }

  Array.prototype.clone = function() {
    return this.map(e => Array.isArray(e) ? e.clone() : e);
  };

  function clone4(arr) {
    return arr.clone();
  }


  function benchmark() {
    function compare(a, b) {
      if (a[1] > b[1]) {
        return -1;
      }
      if (a[1] < b[1]) {
        return 1;
      }
      return 0;
    }

    funcs = [clone1, clone2, clone3, clone4];
    results = [];
    funcs.forEach((ff) => {
      console.log("Benchmarking: " + ff.name);
      var s = time_function(2500, ff, Array(1024));
      results.push([ff, s]);
      console.log("Score: " + s);

    })
    return results.sort(compare);
  }
  return benchmark;
})()
log("Starting benchmark...\n");
res = benchmark();

console.log("Winner: " + res[0][0].name + " !!!");
count = 1;
res.forEach((r) => {
  log((count++) + ". " + r[0].name + " score: " + Math.floor(10000 * r[1] / res[0][1]) / 100 + ((count == 2) ? "% *winner*" : "% speed of winner.") + " (" + Math.round(r[1] * 100) / 100 + ")");
});
log("\nWinner code:\n");
log(res[0][0].toString());
<textarea rows="50" cols="80" style="font-size: 16; resize:none; border: none;" id="log"></textarea>

Điểm chuẩn sẽ chạy trong 10 giây kể từ khi bạn nhấp vào nút.

Kết quả của tôi:

Chrome (động cơ V8):

1. clone1 score: 100% *winner* (4110764)
2. clone3 score: 74.32% speed of winner. (3055225)
3. clone2 score: 30.75% speed of winner. (1264182)
4. clone4 score: 21.96% speed of winner. (902929)

Firefox (Công cụ SpiderMonkey):

1. clone1 score: 100% *winner* (8448353)
2. clone3 score: 16.44% speed of winner. (1389241)
3. clone4 score: 5.69% speed of winner. (481162)
4. clone2 score: 2.27% speed of winner. (192433)

Mã người chiến thắng:

function clone1(arr) {
    return arr.slice(0);
}

Động cơ chiến thắng:

SpiderMonkey (Mozilla / Firefox)


1

Các cách nhanh chóng để sao chép một mảng trong JavaScript theo thứ tự:

#1: array1copy = [...array1];

#2: array1copy = array1.slice(0);

#3: array1copy = array1.slice();

Nếu các đối tượng mảng của bạn chứa một số nội dung không tuần tự hóa JSON (các hàm, Number.POSITIVE_INFINITY, v.v.) tốt hơn để sử dụng

array1copy = JSON.parse(JSON.stringify(array1))


0

Bạn có thể làm theo mã này. Cách bất di bất dịch mảng. Đây là cách hoàn hảo để nhân bản mảng


const array = [1, 2, 3, 4]

const newArray = [...array]
newArray.push(6)
console.log(array)
console.log(newArray)

0

Trong ES6, bạn chỉ cần sử dụng cú pháp lây lan .

Thí dụ:

let arr = ['a', 'b', 'c'];
let arr2 = [...arr];

Xin lưu ý rằng toán tử trải rộng tạo ra một mảng hoàn toàn mới, vì vậy sửa đổi một mảng sẽ không ảnh hưởng đến mảng khác.

Thí dụ:

arr2.push('d') // becomes ['a', 'b', 'c', 'd']
console.log(arr) // while arr retains its values ['a', 'b', 'c']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.