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']
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']
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.
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. –
Cierto, pensé que el concepto era lo que necesitaba, y parece que lo obtuvo de allí. –
Un enfoque que podría tomar sería, usando la biblioteca JSON2:
JSON.stringify
la matriz[
y ]
(o quítelos todos y vuelva a agregar los de inicio y final).JSON.parse
de nuevo a una matriz de JavaScriptestoy suponiendo, por supuesto, usted no está comenzando con una matriz de JavaScript. Si es una cadena, los pasos 1 y 3 son irrelevantes.
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
¡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) –
Toma underscore.js y utiliza la función flatten.
_.flatten([ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]);
ESTA debería ser la respuesta aceptada. No es necesario reinventar la rueda :) –
¡Algunas personas no quieren cargar una nueva secuencia de comandos solo para una funcionalidad! – Rachmaninoff
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í. –
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/
Eso no es necesariamente cierto; consulte http://jsfiddle.net/theycallmeswift/qfpGK/1/ – Swift
yup, la alerta se está aplanando. console.log() muestra el resultado correcto. – Alnitak
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
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"]
Esta debería ser la respuesta aceptada – SwankSwashbucklers
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);
}, []);
};
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
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
¿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"]
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;
}
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']
. 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
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
Usted * podría * simplemente reemplazar la totalidad '[' y '] 'con una cadena vacía y luego agrega un corchete inicial y final. – pimvdb
Eso no es JSON. – Quentin
Entonces, ¿qué es lo que se llama apropiadamente, un objeto, una matriz? – rsk82