2011-03-09 13 views
13

Aquí está una muestra de lo que me gustaría hacerAñadir dos matrices sin utilizar el método concat

function test(r){ 
    var arr = ['d','e','f']; 
    r.push(arr); 
    /* 
    More Code 
    */ 
    return r; 
} 
var result = test(['a','b','c']); 
alert(result.length);//I want this to alert 6 

Lo que necesito hacer es pasar de una matriz y adjuntar otros arreglos para el final de la misma y luego devuelve la matriz. Debido a pasar por referencia, no puedo usar array.concat(array2);. ¿Hay alguna manera de hacerlo sin usar algo como un ciclo for para agregar los elementos uno por uno? Intenté algo como r.push(arr.join()); pero eso tampoco funcionó. Además, me gustaría la opción de tener objetos en las matrices, así que realmente el r.push(arr.join()); no funciona muy bien.

Respuesta

44
>>> var x = [1, 2, 3], y = [4, 5, 6]; 
>>> x.push.apply(x, y) // or Array.prototype.push.apply(x, y) 
>>> x 
[1, 2, 3, 4, 5, 6] 

Alternativamente usando destructuring ahora se puede hacer esto

//generate a new array 
a=[...x,...y]; 
//or modify one of the original arrays 
x.push(...y); 
+0

uso interesante de 'apply' para empujar a todos los miembros de una matriz a otra matriz 1 – meouw

+0

que habían visto el método se aplica antes, pero nunca realmente entendido (Nota para mí misma necesidad para estudiar sobre aplicar), pero ciertamente hace una forma concisa de hacer lo que yo quería. Sin embargo, ¿cómo difiere el segundo método del primero? Usando el Array.prototype en lugar de x.push.apply. – qw3n

+0

Ambos son equivalentes. Llamar a 'x.push (y)' significa "llamar a la función' x.push' con scope 'x' y los argumentos' [y] '. En este caso,' x.push' se resuelve en 'Array.prototype.push' , por lo tanto: 'Array.prototype.push.apply (x, [y])'. Solo mencioné el segundo formulario, ya que a veces es preferible hacer referencia solo 'x' una vez. – emulbreh

2
function test(r){ 
    var _r = r.slice(0), // copy to new array reference 
     arr = ['d','e','f']; 

    _r = _r.concat(arr); // can use concat now 

    return _r; 
} 
var result = test(['a','b','c']); 
alert(result.length); // 6 
+3

Incorrecto, el conjunto que devuelve no es el conjunto modificado eso fue pasado a la función, es una copia – meouw

0

Esto se emulbreh's answer, sólo estoy publicando la prueba que hice para verificarlo. Todo el crédito debe ir a emulbreh

// original array 
var r = ['a','b','c']; 

function test(r){ 
    var arr = ['d','e','f']; 
    r.push.apply(r, arr); 

    /* 
    More Code 
    */ 
    return r; 
} 
var result = test(r); 
console.log(r); // ["a", "b", "c", "d", "e", "f"] 
console.log(result === r); // the returned array IS the original array but modified