Лучший способ объединить массив в массив в javascript
есть ли лучший способ, чем это, чтобы объединить массив в другой массив в javascript
var string = 'theArray.splice('+start+', '+number+',"'+newItemsArray.join('","')+'");';
eval(string);
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); });
Я уверен, что первый является производительным (это слово ;), но не поддерживается во всех браузерах там в дикой природе.