¿Cómo simplemente aplanar matriz en jQuery? Tengo:Cómo aplanar la matriz en jQuery?
[1, 2, [3, 4], [5, 6], 7]
Y quiero:
[1, 2, 3, 4, 5, 6, 7]
¿Cómo simplemente aplanar matriz en jQuery? Tengo:Cómo aplanar la matriz en jQuery?
[1, 2, [3, 4], [5, 6], 7]
Y quiero:
[1, 2, 3, 4, 5, 6, 7]
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]
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).
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.
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
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') –
Hmm. Tienes razón. Podría haber jurado que lo había intentado antes y no funcionó. – dnuttle
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]
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.
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;
}
Mejor agregue una 'var' al código' b = .... 'para evitar un extra global. –
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 ]
Es bueno tener en cuenta que funciona, pero solo para los navegadores modernos (a menos que tenga el borde) –
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);
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);
Otorgado, así es como se formuló en la pregunta, pero esto también solo aplanará un nivel. – phil