una - tablas en javascript ejemplos
Una mejor forma de empalmar una matriz en una matriz en JavaScript (6)
Puede usar apply para evitar eval:
var args = [start, number].concat(newItemsArray);
Array.prototype.splice.apply(theArray, args);
La función aplicar se usa para llamar a otra función, con un contexto y argumentos dados, provistos como una matriz, por ejemplo:
Si llamamos:
var nums = [1,2,3,4];
Math.min.apply(Math, nums);
La función aplicar se ejecutará:
Math.min(1,2,3,4);
¿Hay una mejor manera que esto para empalmar una matriz en otra matriz en JavaScript?
var string = ''theArray.splice(''+start+'', ''+number+'',"''+newItemsArray.join(''","'')+''");'';
eval(string);
También puede agregar tal función al prototipo de Array, si desea algo que sea casi idéntico al método de empalme. P.ej
Array.prototype.spliceArray = function(index, n, array) {
return Array.prototype.splice.apply(this, [index, n].concat(array));
}
Entonces el uso sería simplemente:
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"]
Véalo en acción aquí: http://jsfiddle.net/TheMadDeveloper/knv2f8bb/1/
Algunas notas:
- La función de
splice
modifica la matriz directamente, pero devuelve una matriz de elementos que se eliminaron ... no la matriz empalmada. - Si bien normalmente no se recomienda extender las clases básicas de JavaScript, esto es relativamente benigno con la mayoría de los marcos estándar.
- La ampliación de la
Array
no funcionará en los casos en que se utilicen clases de matriz especializadas, como datos de ImageData Uint8ClampedArray.
Las respuestas anteriores que involucran empalmar.aplicar e insertar la matriz en un trazador de líneas único harán explotar la pila en un desbordamiento de pila para una matriz grande. Vea el ejemplo aquí: http://jsfiddle.net/gkohen/u49ku99q/. Puede que tenga que cortar y empujar cada elemento de la parte insertada y restante de la matriz original para que funcione. Ver violín: 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]);
}
}
}
Quería tener una función que tomaría solo una parte de la matriz fuente, así que tengo la mía ligeramente diferente en función de la respuesta de CMS
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);
}
Puede verlo en: https://jsfiddle.net/matthewvukomanovic/nx858uz5/
Esta pregunta es realmente antigua, pero con ES6, hay una forma más simple de hacerlo con el operador de propagación:
sourceArray.splice(index, 0, ...insertedArray)
Si está utilizando javascript sin compilar en el navegador, asegúrese de comprobar si es compatible con su navegador de destino en https://kangax.github.io/compat-table/es6/#test-spread_(...)_operator .
Además, esto puede estar ligeramente fuera de tema, pero si no quiere o no necesita modificar la matriz original, pero podría usar una nueva matriz en su lugar, considere este enfoque:
mergedArray = sourceArray.slice(0, index).concat(insertedArray, sourceArray.slice(index))
Envuelve eso en una función y obtienes esto:
function insertArrayAt(array, index, arrayToInsert) {
Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
}
Lo usarías así:
var arr = ["A", "B", "C"];
insertArrayAt(arr, 1, ["x", "y", "z"]);
alert(JSON.stringify(arr)); // output: A, x, y, z, B, C
Puede verificarlo en este jsFiddle: http://jsfiddle.net/luisperezphd/Wc8aS/