Лучший способ объединить массив в массив в javascript


есть ли лучший способ, чем это, чтобы объединить массив в другой массив в javascript

var string = 'theArray.splice('+start+', '+number+',"'+newItemsArray.join('","')+'");';
eval(string);
7 59

7 ответов:

можно использовать применить чтобы избежать eval:

var args = [start, number].concat(newItemsArray);
Array.prototype.splice.apply(theArray, args);

The применить функция используется для вызова другой функции с заданным контекстом и аргументами, предоставленными в виде массива, например:

Если мы называем:

var nums = [1,2,3,4];
Math.min.apply(Math, nums);

функция apply выполнит:

Math.min(1,2,3,4);

обновление: версия ES6

Если ваша кодировка в ES6 вы можете использовать" оператор распространения" (...)

array.splice(index, 0, ...arrayToInsert);

чтобы узнать больше об операторе распространения см. документация mozilla.

"старый" способ ES5

Если вы обернете верхний ответ в функцию, вы получите следующее:

function insertArrayAt(array, index, arrayToInsert) {
    Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
}

вы бы использовали его так:

var arr = ["A", "B", "C"];
insertArrayAt(arr, 1, ["x", "y", "z"]);
alert(JSON.stringify(arr)); // output: A, x, y, z, B, C

вы можете проверить это jsFiddle: http://jsfiddle.net/luisperezphd/Wc8aS/

этот вопрос действительно старый, но с ES6 есть более простой способ сделать это с помощью оператора spread:

sourceArray.splice(index, 0, ...insertedArray)

Если вы используете нескомпилированный javascript в браузере, убедитесь, что он поддерживается в вашем целевом браузере по адресу https://kangax.github.io/compat-table/es6/#test-spread_ (...) _оператор.


кроме того, это может быть немного не по теме, но если вы не хотите или должны изменить исходный массив, но может использовать новый массив вместо этого рассмотрим такой подход:

mergedArray = sourceArray.slice(0, index).concat(insertedArray, sourceArray.slice(index))

вы также можете добавить такую функцию в прототип массива, если вы хотите что-то, что почти идентично методу splice. Е. Г.

Array.prototype.spliceArray = function(index, n, array) {
    return Array.prototype.splice.apply(this, [index, n].concat(array));
}

тогда использование будет просто:

var array = ["A","B","C","","E","F"];

array.splice(3,1,"D");
// array is ["A","B","C","D","E","F"]

array.spliceArray(3,3,["1","2","3"]);
// array is ["A","B","C","1","2","3"]

смотрите его в действии здесь:http://jsfiddle.net/TheMadDeveloper/knv2f8bb/1/

некоторые замечания:

  • The splice функция изменяет массив напрямую, но возвращает массив элементов, которые были удалены... не сплайсированные матрица.
  • хотя обычно не рекомендуется расширять основные классы javascript, это относительно безопасно для большинства стандартных фреймворков.
  • расширения Array не будет работать в тех случаях, когда используются специализированные классы массива, такие как данные ImageData Uint8ClampedArray.

ответы выше, которые включают в себя сращивание.применить и вставить массив в один лайнер взорвет стек в переполнении стека для большого массива. Смотрите пример здесь: http://jsfiddle.net/gkohen/u49ku99q/ Возможно, вам придется разрезать и нажать каждый элемент вставленной и оставшейся части исходного массива для его работы. См. скрипка:http://jsfiddle.net/gkohen/g9abppgy/26/

Array.prototype.spliceArray = function(index, insertedArray) {
   var postArray = this.splice(index);
   inPlacePush(this, insertedArray);
   inPlacePush(this, postArray);

   function inPlacePush(targetArray, pushedArray) {
// Not using forEach for browser compatability
       var pushedArrayLength = pushedArray.length;
       for (var index = 0; index < pushedArrayLength; index++) {
           targetArray.push(pushedArray[index]);
       }
   }
}

Я хотел иметь функцию, которая будет принимать только часть исходного массива, поэтому у меня есть немного другой основе платформы

function spliceArray(array, index, howmany, source, start, end) {
    var arguments;
  if( source !== undefined ){
    arguments = source.slice(start, end);
    arguments.splice(0,0, index, howmany);
  } else{
   arguments = [index, howmany];
  }
    return Array.prototype.splice.apply(array, arguments)
}

Array.prototype.spliceArray = function(index, howmany, source, start, end) {
    return spliceArray(this, index, howmany, source, start, end);
}

вы можете увидеть его по адресу:https://jsfiddle.net/matthewvukomanovic/nx858uz5/

здесь много умных ответов, но причина, по которой вы используете splice, заключается в том, что он помещает элементы в текущий массив без создания другого. Если вам нужно создать массив в concat() против, так что вы можете использовать apply() тогда вы создаете 2 дополнительных мусорных массивов! Sorta побеждает всю цель написания эзотерического Javascript. Кроме того, если вы не заботитесь о том, что материал использования памяти (и вы должны) просто dest = src1.concat(src2); это бесконечно более читабельным. Так вот мой самый маленький количество строк при сохранении эффективного ответа.

for( let item of src ) dest.push( item );

или если вы хотите, чтобы заполнить его и иметь немного лучшую поддержку браузера обратно:

src.forEach( function( x ) { dest.push(x); });

Я уверен, что первый является производительным (это слово ;), но не поддерживается во всех браузерах там в дикой природе.