Tengo una matriz que contiene varias matrices, cada una con varios objetos, similar a esta.
[[object1, object2],[object1],[object1,object2,object3]]
Aquí hay una captura de pantalla del objeto registrado en la consola.
¿Cuál sería el mejor enfoque para aplanar esto para que sea solo una matriz de objetos?
He intentado esto sin suerte:
console.log(searchData); var m = [].concat.apply([],searchData); console.log(m);
searchData cierra la sesión de la captura de pantalla anterior, pero m cierra la sesión [ ]
Aquí está el contenido real de searchData:
[[{"_id":"55064111d06b96d974937a6f","title":"Generic Title","shortname":"generic-title","contents":"<p>The Healing Center offers practical, social, and spiritual support to individuals and families. Services include, but are not limited to: food and clothing, job skills training and job search assistance, auto repair (Saturdays only), mentoring, financial counseling, tutoring, prayer, life skills training, and helpful information about local community services.</p><p>Stay in touch with us:</p>","__v":0},{"_id":"5508e1405c621d4aad2d2969","title":"test english","shortname":"test-page","contents":"<h2>English Test</h2>","__v":0}],[{"_id":"550b336f33a326aaee84f883","shortname":"ok-url","title":"now english","contents":"<p>okokko</p>","category":"Transportation","__v":0}]]
Puede usar Array.concat como a continuación: -
var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']]; var flattened = [].concat.apply([],arr);
flattened
será su matriz esperada.
ES 2020 proporciona el flat , también flatMap si desea iterar, a listas planas de listas:
[['object1'], ['object2']].flat() // ['object1', 'object2']
Una solución recursiva para el aplanamiento profundo (anidado):
function flatten(a) { return Array.isArray(a) ? [].concat.apply([], a.map(flatten)) : a; }
Un poco más compacto con ES6:
var flatten = a => Array.isArray(a) ? [].concat(...a.map(flatten)) : a;
Por diversión, usando un generador llamado F
para "aplanar", para generar perezosamente valores aplanados:
function *F(a) { if (Array.isArray(a)) for (var e of a) yield *F(e); else yield a; } >> console.log(Array.from(F([1, [2], 3]))); << [ 1, 2, 3 ]
Para aquellos que no están familiarizados con los generadores, la sintaxis yield *
arroja valores de otro generador. Array.from
toma un iterador (como los resultados de invocar la función de generador) y lo convierte en una matriz.
Si solo necesita aplanar simple, esto puede funcionar:
var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']]; var flatenned = arr.reduce(function(a,b){ return a.concat(b) }, []);
Para un aplanamiento más complejo, Lodash tiene la función de aplanamiento, que tal vez sea lo que necesita: https://lodash.com/docs#flatten
//Syntax: _.flatten(array, [isDeep]) _.flatten([1, [2, 3, [4]]]); // → [1, 2, 3, [4]]; // using `isDeep` to recursive flatten _.flatten([1, [2, 3, [4]]], true); // → [1, 2, 3, 4];