javascript - loop - jsperf




Javascript-在另一個數組中插入一個數組 (6)

擴展運算符允許在需要多個參數(用於函數調用)或多個元素(用於數組文字)的地方擴展表達式。

a2 = [21,22];
a1 = [1,2,...a2,3,4,5];//...a2 is use of spread operator
console.log(a1);

在另一個數組中插入數組的更有效的方法是什麼?

a1 = [1,2,3,4,5];
a2 = [21,22];

newArray - a1.insertAt(2,a2) -> [1,2, 21,22, 3,4,5];

如果a2數組很大,則從性能的角度來看,使用拼接對a2進行迭代看起來有點誇張。

謝謝。


你可以使用splice結合一些apply技巧:

a1 = [1,2,3,4,5];
a2 = [21,22];

a1.splice.apply(a1, [2, 0].concat(a2));

console.log(a1); // [1, 2, 21, 22, 3, 4, 5];

在ES2015 +中,您可以使用擴展運算符來使其更好一些

a1.splice(2, 0, ...a2);


我想找到一種方法來做到這一點與splice()並沒有迭代: http : //jsfiddle.net/jfriend00/W9n27/

a1 = [1,2,3,4,5];
a2 = [21,22];

a2.unshift(2, 0);          // put first two params to splice onto front of array
a1.splice.apply(a1, a2);   // pass array as arguments parameter to splice
console.log(a1);           // [1, 2, 21, 22, 3, 4, 5];

通用功能形式:

function arrayInsertAt(destArray, pos, arrayToInsert) {
    var args = [];
    args.push(pos);                           // where to insert
    args.push(0);                             // nothing to remove
    args = args.concat(arrayToInsert);        // add on array to insert
    destArray.splice.apply(destArray, args);  // splice it in
}

起初是錯的 應該使用concat()來代替。

var a1 = [1,2,3,4,5];
var a2 = [21,22];

var result = a1.slice( 0, 2 ).concat( a2 ).concat( a1.slice( 2 ) );

例如: http : //jsfiddle.net/f3cae/1/

這需要a1slice() [docs]直到索引,然後執行concat() [docs]a2添加到該數組,然後再次使用.concat()取另一個.slice()時間從同一個索引開始。

如果你願意,可以將它添加到Array.prototype

例如: http : //jsfiddle.net/f3cae/2/

Array.prototype.injectArray = function( idx, arr ) {
    return this.slice( 0, idx ).concat( arr ).concat( this.slice( idx ) );
};

var a1 = [1,2,3,4,5];
var a2 = [21,22];

var result = a1.injectArray( 2, a2 );

您可以使用splice() [docs]方法而不進行迭代。

a1.splice( 2, 0, a2 );

http://jsfiddle.net/f3cae/


這是我的版本沒有特別的技巧:

function insert_array(original_array, new_values, insert_index) {
    for (var i=0; i<new_values.length; i++) {
        original_array.splice((insert_index + i), 0, new_values[i]);
    }
    return original_array;
}




performance