Pregunta Javascript empuja los valores de la matriz a otra matriz


Tengo una matriz de JavaScript dataArray que quiero insertar en una nueva matriz newArray. Excepto que no quiero newArray[0] ser dataArray. Quiero insertar todos los valores en la nueva matriz:

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

o mejor:

var newArray = new Array (
   dataArray1.values(),
   dataArray2.values(),
   // ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);

Entonces, ahora la nueva matriz contiene todos los valores de las matrices de datos individuales. ¿Hay alguna taquigrafía como pushValues disponible para que no tenga que iterar sobre cada dataArray individual, agregando los valores 1 por 1?


650
2017-11-11 15:33


origen


Respuestas:


Utilizar el concat función, así:

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);

El valor de newArray estarán [1, 2, 3, 4] (arrayA y arrayB permanece inalterable; concat crea y devuelve una nueva matriz para el resultado).


877
2017-11-11 15:37



Siempre que sus matrices no sean enormes (consulte la advertencia a continuación), puede usar push() método de la matriz a la que desea agregar valores. push() puede tomar múltiples parámetros para que pueda usar su apply() método para pasar el conjunto de valores que se enviarán como una lista de parámetros de funciones. Esto tiene la ventaja sobre el uso concat() de agregar elementos a la matriz en lugar de crear una nueva matriz.

Sin embargo, parece que para arreglos grandes (del orden de 100,000 miembros o más), este truco puede fallar. Para tales matrices, usar un bucle es un mejor enfoque. Ver https://stackoverflow.com/a/17368101/96100 para detalles.

var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);

Es posible que desee generalizar esto en una función:

function pushArray(arr, arr2) {
    arr.push.apply(arr, arr2);
}

... o agregarlo a Arrayprototipo de s:

Array.prototype.pushArray = function(arr) {
    this.push.apply(this, arr);
};

var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);

... o emular el original push() método al permitir múltiples parámetros utilizando el hecho de que concat(), me gusta push(), permite múltiples parámetros:

Array.prototype.pushArray = function() {
    this.push.apply(this, this.concat.apply([], arguments));
};

var newArray = [];
newArray.pushArray(dataArray1, dataArray2);

Aquí hay una versión basada en bucle del último ejemplo, adecuada para matrices de gran tamaño y todos los principales navegadores, incluido IE <= 8:

Array.prototype.pushArray = function() {
    var toPush = this.concat.apply([], arguments);
    for (var i = 0, len = toPush.length; i < len; ++i) {
        this.push(toPush[i]);
    }
};

584
2017-11-11 15:38



Agregaré una respuesta más "a prueba de futuro"

En ECMAScript 6, puede usar operador de propagación:

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);

El operador de propagación aún no está incluido en todos los principales navegadores. Para la compatibilidad actual, vea esto (continuamente actualizado) tabla de compatibilidad.

Sin embargo, puede usar el operador de propagación con Babel.js.


212
2017-09-10 21:12



Encontrado de una manera elegante de MDN

var vegetables = ['parsnip', 'potato'];
var moreVegs = ['celery', 'beetroot'];

// Merge the second array into the first one
// Equivalent to vegetables.push('celery', 'beetroot');
Array.prototype.push.apply(vegetables, moreVegs);

console.log(vegetables); // ['parsnip', 'potato', 'celery', 'beetroot']

O puedes usar el spread operator característica de ES6:

let fruits = [ 'apple', 'banana'];
const moreFruits = [ 'orange', 'plum' ];

fruits.push(...moreFruits); // ["apple", "banana", "orange", "plum"]

124
2017-11-11 15:37



var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

¿Eso resuelve tu problema?


11
2018-04-11 04:32



Lo siguiente me parece más simple:

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

Como "push" toma una cantidad variable de argumentos, puede usar apply método de la push función para empujar todos los elementos de otra matriz. Construye una llamada a push usando su primer argumento ("newArray" aquí) como "this" y el elementos de la matriz como los argumentos restantes.

los slice en la primera instrucción obtiene una copia de la primera matriz, por lo que no la modifica.

Actualizar Si está utilizando una versión de javascript con slice disponible, puede simplificar push expresión a:

newArray.push(...dataArray2)

10
2018-06-29 18:24



Con JavaScript ES6, puede usar el ... operador como un operador extendido que esencialmente convertirá la matriz en valores. Entonces, puedes hacer algo como esto:

var myArray = [1,2,3,4,5];
var moreData = [6,7,8,9,10];

myArray = [
  ...myArray,
  ...moreData,
];

Si bien la sintaxis es concisa, no sé cómo funciona esto internamente y cuáles son las implicaciones de rendimiento en las matrices de gran tamaño.


6
2018-05-20 15:01