Fastest way to duplicate an array in JavaScript - slice vs. 'for' loop

后端 未结 22 1483
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 02:10

In order to duplicate an array in JavaScript: which of the following is faster to use?

###Slice method

var dup_array = original_array.slice();
<         


        
相关标签:
22条回答
  • 2020-11-22 02:35

    ECMAScript 2015 way with the Spread operator:

    Basic examples:

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

    Try in the browser console:

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

    References

    • 6 Great Uses of the Spread Operator
    • Spread syntax
    0 讨论(0)
  • 2020-11-22 02:35

    It depends on the length of the array. If the array length is <= 1,000,000, the slice and concat methods are taking approximately the same time. But when you give a wider range, the concat method wins.

    For example, try this code:

    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();
    

    If you set the length of original_array to 1,000,000, the slice method and concat method are taking approximately the same time (3-4 ms, depending on the random numbers).

    If you set the length of original_array to 10,000,000, then the slice method takes over 60 ms and the concat method takes over 20 ms.

    0 讨论(0)
  • 2020-11-22 02:35

    A simple solution:

    original = [1,2,3]
    cloned = original.map(x=>x)
    
    0 讨论(0)
  • 2020-11-22 02:35

    You can follow this code. Immutable way array clone. This is the perfect way to array cloning

    
    const array = [1, 2, 3, 4]
    
    const newArray = [...array]
    newArray.push(6)
    console.log(array)
    console.log(newArray)
    
    0 讨论(0)
  • 2020-11-22 02:40

    a.map(e => e) is another alternative for this job. As of today .map() is very fast (almost as fast as .slice(0)) in Firefox, but not in Chrome.

    On the other hand, if an array is multi-dimensional, since arrays are objects and objects are reference types, none of the slice or concat methods will be a cure... So one proper way of cloning an array is an invention of Array.prototype.clone() as follows.

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

    0 讨论(0)
  • 2020-11-22 02:43

    what about es6 way?

    arr2 = [...arr1];
    
    0 讨论(0)
提交回复
热议问题