2011-10-24 37 views

Respuesta

53

Puede utilizar jQuery.map, que es el camino a seguir si usted tiene la biblioteca jQuery ya cargado.

$.map([1, 2, [3, 4], [5, 6], 7], function(n){ 
    return n; 
}); 

devoluciones

[1, 2, 3, 4, 5, 6, 7] 
+5

Otorgado, así es como se formuló en la pregunta, pero esto también solo aplanará un nivel. – phil

4

Puede utilizar jQuery.map():

de devolución de llamada (valor, indexOrKey) La función de procesar cada elemento contra. El primer argumento para la función es el valor; el segundo argumento es el índice o clave de la matriz o propiedad del objeto. La función puede devolver cualquier valor para agregar a la matriz. Una matriz devuelta se aplanará en la matriz resultante. Dentro de la función, este se refiere al objeto global (ventana).

11
var a = [1, 2, [3, 4], [5, [6, [7, 8]]]]; 
var b = []; 

function flatten(e,b){ 
    if(typeof e.length != "undefined") 
    { 
     for (var i=0;i<e.length;i++) 
     { 
      flatten(e[i],b); 
     } 
    } 
    else 
    { 
     b.push(e); 
    } 
} 
flatten(a,b); 
console.log(b); 

La función aplanar debe hacerlo, y esto no requiere jQuery. Simplemente copie todo esto en Firebug y ejecútelo.

+0

Debo agregar que esto aplanará no solo las matrices, sino cualquier cosa que tenga un método de "longitud". Realmente no es posible estar seguro en Javascript de que algo es una verdadera matriz a menos que se haya declarado como una nueva matriz(). – dnuttle

+0

dnuttle: En realidad, creo que el uso de 'obj instanceof Array' está más que garantizado. (A menos que haya otra variable llamada Array, entonces puede usar 'obj instanceof [] .constructor') –

+0

Hmm. Tienes razón. Podría haber jurado que lo había intentado antes y no funcionó. – dnuttle

33

usar el poder de JavaScript:

var a = [[1, 2], 3, [4, 5]]; 

console.log(Array.prototype.concat.apply([], a)); 
//will output [1, 2, 3, 4, 5] 
+3

Eso funciona si solo tienes matrices anidadas de un nivel profundo. Si tienes una matriz en una matriz en una matriz, no se aplastará. – dnuttle

+1

@dnuttle Claro, pero esta condición no se indicó en la pregunta. – bjornd

+28

-1 no es suficiente jQuery (broma) – JiminP

20

Así es como se podría utilizar jQuery para aplanar las matrices anidadas:

$.map([1, 2, [3, 4], [5, [6, [7, 8]]]], function recurs(n) { 
    return ($.isArray(n) ? $.map(n, recurs): n); 
}); 

devuelve:

[1, 2, 3, 4, 5, 6, 7, 8] 

se aprovecha de jQuery.map como así como jQuery.isArray.

0

vieja pregunta, lo sé, pero ...

he encontrado que esto funciona, y es rápido:

function flatten (arr) { 
    b = Array.prototype.concat.apply([], arr); 
    if (b.length != arr.length) { 
    b = flatten(b); 
    }; 

    return b; 
} 
+2

Mejor agregue una 'var' al código' b = .... 'para evitar un extra global. –

5

para aplanar de forma recursiva una matriz se puede utilizar la función nativa Array.reduce. No es necesario usar jQuery para eso.

function flatten(arr) { 
    return arr.reduce(function flatten(res, a) { 
     Array.isArray(a) ? a.reduce(flatten, res) : res.push(a); 
     return res; 
    }, []); 
} 

Ejecutora

flatten([1, 2, [3, 4, [5, 6]]]) 

vuelve

[ 1, 2, 3, 4, 5, 6 ] 
+0

Es bueno tener en cuenta que funciona, pero solo para los navegadores modernos (a menos que tenga el borde) –

0

Uso recursividad si tiene varios niveles:

flaten = function(flatened, arr) { 
    for(var i=0;i<arr.length;i++) { 
     if (typeof arr[i]!="object") { 
      flatened.push(arr[i]); 
     } 
     else { 
      flaten(flatened,arr[i]); 
     } 
    } 
    return; 
} 

a=[1,[4,2],[2,7,[6,4]],3]; 
b=[]; 
flaten(b,a); 
console.log(b); 
1

Puede utilizar Array.prototype.reduce que técnicamente no es J Consulta, pero ES5 válido:

var multidimensionArray = [1, 2, [3, 4], [5, 6], 7]; 
var initialValue = []; 

var flattened = multidimensionArray.reduce(function(accumulator, current) { 
    return accumulator.concat(current); 
}, initialValue); 

console.log(flattened);