2011-05-17 9 views
8

Eso es hacer esto:¿Hay alguna manera fácil de hacer que la matriz anidada sea plana?

[ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]

en:

['dog','cat','chicken','bear','mouse','horse']

+2

Usted * podría * simplemente reemplazar la totalidad '[' y '] 'con una cadena vacía y luego agrega un corchete inicial y final. – pimvdb

+3

Eso no es JSON. – Quentin

+1

Entonces, ¿qué es lo que se llama apropiadamente, un objeto, una matriz? – rsk82

Respuesta

20
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) { 
    return a.concat(b); 
}); 
// flattened is [0, 1, 2, 3, 4, 5] 

Es nota digna que reducen ISN No es compatible con IE 8 y versiones anteriores.

developer.mozilla.org reference

+2

Esto no hace lo que el OP quería. Produce ["perro", "gato", ["pollo", "oso"], "ratón", "caballo"] dejando la matriz interna como una matriz en lugar de aplanar también sus elementos. –

+0

Cierto, pensé que el concepto era lo que necesitaba, y parece que lo obtuvo de allí. –

0

Un enfoque que podría tomar sería, usando la biblioteca JSON2:

  1. JSON.stringify la matriz
  2. Stri p out todo, excepto el primero y el último [ y ] (o quítelos todos y vuelva a agregar los de inicio y final).
  3. JSON.parse de nuevo a una matriz de JavaScript

estoy suponiendo, por supuesto, usted no está comenzando con una matriz de JavaScript. Si es una cadena, los pasos 1 y 3 son irrelevantes.

+0

JSON.stringify bucles internos de forma recursiva sobre la matriz, por lo que en este método que avanza sobre ella toda twice..so es posible que desee simplemente hacer la recursión a sí mismo y empuje todos los "números" se encuentran a una nueva matriz, y el retorno que uno – vsync

+0

¡lol ... + 1 por creatividad ... solo ten cuidado de no eliminar ningún corchete de dentro de los valores cotizados! Es una idea loca, pero podría funcionar. (en realidad, solo use lodash.flatten) –

9

Toma underscore.js y utiliza la función flatten.

_.flatten([ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]); 
+0

ESTA debería ser la respuesta aceptada. No es necesario reinventar la rueda :) –

+0

¡Algunas personas no quieren cargar una nueva secuencia de comandos solo para una funcionalidad! – Rachmaninoff

+0

A continuación, tome el guión bajo, observe cómo funciona su función aplanar y escriba el suyo en lugar de quejarse aquí. –

4

Suponiendo un array que ya está desempaquetado de JSON, intente esto:

Array.prototype.flatten = function() { 
    var r = []; 
    for (var i = 0; i < this.length; ++i) { 
     var v = this[i]; 
     if (v instanceof Array) { 
      Array.prototype.push.apply(this, v.flatten()); 
     } else { 
      r.push(v); 
     } 
    } 
    return r; 
}; 

Parece que funciona correctamente en su entrada - ver http://jsfiddle.net/alnitak/Ws7L5/

+0

Eso no es necesariamente cierto; consulte http://jsfiddle.net/theycallmeswift/qfpGK/1/ – Swift

+0

yup, la alerta se está aplanando. console.log() muestra el resultado correcto. – Alnitak

+0

p.s. downvote es duro para el código que realmente funcionó pero no mostró el resultado correctamente debido a un comportamiento inesperado de alerta() – Alnitak

20

En los navegadores modernos se puede hacer esto sin ninguna biblioteca externa en unas pocas líneas:

Array.prototype.flatten = function() { 
    return this.reduce(function(prev, cur) { 
    var more = [].concat(cur).some(Array.isArray); 
    return prev.concat(more ? cur.flatten() : cur); 
    },[]); 
}; 

console.log([['dog','cat',['chicken', 'bear']],['mouse','horse']].flatten()); 
//^ ["dog", "cat", "chicken", "bear", "mouse", "horse"] 
+0

Esta debería ser la respuesta aceptada – SwankSwashbucklers

4

Pequeño solución para solución ChewOnThis_Trident y funciona perfecto:

Array.prototype.flatten = function() { 
    return this.reduce(function(a, b) { 
     return a.concat(b); 
    }, []); 
}; 
1

I Sé que esto es tarde, pero también me encontré con una situación en la que necesitaba hacer una matriz multidimensional en 1 matriz e hice una función de la siguiente manera.

function nested(arr) { 
    var noNest = arr.toString().split(',').filter(Boolean), 
     i = 0; 

    for(i;i<noNest.length; i++){ 
     if(isNaN(noNest[i])){ 
      return console.log(noNest); 
     } else { 
      noNest[i] = parseInt(noNest[i]); 
     } 
    } 
    return console.log(noNest); 
} 

nested([[['a']], [['b']]]); 

Esto también tomar las matrices anidadas dentro de la matriz probado y se asegura de su una matriz como el último out puso

+0

No es necesario que tenga el filtro, pero como está actualmente, esto convertirá automáticamente los números que son cadenas en enteros pero que se pueden editar fácilmente. Estoy seguro de que alguien también lo encontrará útil y no se ejecutará en círculos como tuve que hacerlo al – TrojanMorse

5

¿Qué hay de éste código de revestimiento?

[ ['dog','cat', ['chicken', 'bear'] ],[['mouse','horse'],'lion'] ].join().split(',') 

básicamente se unen hará cadena separada por comas de matriz anidada y el uso de la división se pueden obtener matriz 1d, bonita? bono que va a trabajar en todos los navegadores, así :)

lo que la salida será: -

["dog", "cat", "chicken", "bear", "mouse", "horse", "lion"] 
1

Esta solución ha estado trabajando muy bien para mí, y me resulta particularmente fácil de seguir:

function flattenArray(arr) { 
    // the new flattened array 
    var newArr = []; 

    // recursive function 
    function flatten(arr, newArr) { 
    // go through array 
    for (var i = 0; i < arr.length; i++) { 
     // if element i of the current array is a non-array value push it 
     if (Array.isArray(arr[i]) === false) { 
     newArr.push(arr[i]); 
     } 
     // else the element is an array, so unwrap it 
     else { 
     flatten(arr[i], newArr); 
     } 
    } 
    } 

    flatten(arr, newArr); 

    return newArr; 
} 
1

Por eso me encanta javascript:

function flattenArray(source) { 
    return source.toString().split(','); 
} 

flattenArray([['dog', 'cat', ['chicken', 'bear']], ['mouse', 'horse']]); 
// -> ['dog','cat','chicken','bear','mouse','horse'] 
+0

. Es genial cuando la matriz es pequeña y las palabras no tienen "," en el interior; una vez que crece, el rendimiento puede ser un problema. – calbertts

0

También puede usar este array-flatMap componente de fuente abierta.

Ejemplo:

flatMap([[1, 2, 3], [4, 5, 6]], val => val) // => [1, 2, 3, 4, 5, 6] 

Uno de su prueba muestra este ejemplo relevante para este caso:

flatMap() should flatten the multi-dimensional array to a single-dimensional one 
Cuestiones relacionadas