2011-01-30 11 views
5

¿Hay una construida en la forma de añadir una lista a otra, así:Javascript: presione una lista completa?

var a = [1,2,3]; 
a.append([4,5]); 
// now a is [1,2,3,4,5]; 

concat() hace algo similar, pero devuelve el resultado. Quiero algo que modifica la lista existente como push()

+0

posible duplicado de [Javascript arrastrar valores de matriz a otra matriz] (http://stackoverflow.com/questions/4156101/javascript-push-array-values-into-another-array), [cómo hacer un "plano push "en javascript?] (http://stackoverflow.com/questions/4007744/how-to-do-a-flat-push-in-javascript) – outis

Respuesta

15

push va a funcionar, pero también hay que utilizar apply.

var a = [1,2,3]; 
a.push.apply(a, [4,5]) 
+1

Eso tiene que ser 'Array.prototype.push.apply', creo. – lonesomeday

+0

@lonesomeday: piensas correctamente. 'a.push.apply' también funcionará. Aparentemente dividí la diferencia. – outis

+0

¿Podría elaborar un poco más sobre * cómo * esto funciona? – KooiInc

3

¿Qué tal esto:

var a = [1, 2, 3]; 
a = a.concat([4, 5]); 
// a is now [1, 2, 3, 4, 5] 
+0

¿No sería más eficiente empujarlos uno tras otro? – shoosh

+0

@shoosh, sí, probablemente sería más eficiente. –

+0

considere seguir el código antes de concatenar: var b = a; La variable a cambia, pero b sigue siendo 1, 2, 3. [ejemplo] (http://jsfiddle.net/rg3sj/) – gor

4
var list = [1, 2]; 

La gente ya que mostraron cómo hacer esto con:

  1. empuje: list.push.apply(list, [3, 4]);
  2. concat: list = list.concat([4, 5]);

Pero quiero decir sobre ES6 spread operator: list.push(...[3, 4]); .

Tenga en cuenta que actualmente no hay muchos navegadores compatibles (puede usar transpilers).

+0

Descubrí que, si su matriz es muy grande e inserta solo alrededor de 5-20 elementos, el método 'list.push.apply' es mucho más rápido. – Aloso

+0

@Aloso Gracias, puede publicar esto como una respuesta con un punto de referencia correspondiente (sería bueno ver los números detrás de "extremadamente mucho más rápido" y "muy grande" –

+0

No creo que esto merezca una respuesta completa. , Hice un jsperf para la velocidad de prueba: https://jsperf.com/array-vs-linkedlist-concat – Aloso

3

Si está utilizando ES6 puede utilizar el operador de difusión

por ejemplo: -

listOne = [1,2,3] 
listTwo = [4,5,6] 
listTwo.push(...listOne) 
0

Debido a que acabo de escribir una aplicación web en la que una gran cantidad de matrices tiene que ser concatenados y donde el rendimiento es crítico , Probé qué método es el más rápido in this jsperf. Los resultados son muy interesantes.

En mi prueba, agrego 10 elementos a una lista o matriz de 10.000 elementos.

Aquí están los casos de prueba, del más rápido al más lento.Los resultados se miden en Chrome 62, pero Firefox 47 funciona de manera similar:

  • LinkedList.prototype.concat: 90,313,485 ops/seg

    list.concat(concatList); 
    // This function has to change only 1-2 refences 
    
  • Array.prototype.push en un bucle for: 3,794,962 ops/seg

    for (var i = 0, len = concatArr.length; i < len; i++) { 
        array.push(concatArr[i]); 
    } 
    // Probably fastest in real life 
    
  • Array.prototype.push.apply: 2,193,469 ops/sec

    array.push.apply(array, concatArr); 
    
  • Array.prototype.concat: 22701 ops/seg

    array = array.concat(concatArr); 
    

Por desgracia, la versión LinkedList no funciona si quieres concat una matriz/lista para múltiplesLinkedList s. Tampoco tiene ningún beneficio si se debe copiar una matriz a LinkedList antes de cada operación de concat. Entonces, para mí, el ganador es el para el ciclo.

Una razón para no usar Array.prototype.push.apply es que falla si la matriz concatenada es demasiado grande. De acuerdo con this answer, la matriz concatenada no puede tener más de 500,000 elementos en Firefox y 150,000 elementos en Chrome.

He excluido el spread operator porque no es compatible con todos los navegadores. En Chrome, es tan rápido como Array.prototype.push.apply, en Firefox es un poco más lento.

Cuestiones relacionadas