J'ai un tableau qui contient plusieurs tableaux, chacun contenant plusieurs objets, semblable à celui-ci.
[[object1, object2],[object1],[object1,object2,object3]]
Voici une capture d'écran de l'objet connecté à la console .
Quelle serait la meilleure approche pour aplatir ceci afin qu’il se limite à un tableau d’objets?
J'ai essayé sans succès:
console.log(searchData);
var m = [].concat.apply([],searchData);
console.log(m);
searchData déconnecte la capture d'écran ci-dessus, mais m se déconnecte []
Voici le contenu actuel 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}]]
Vous pouvez utiliser Array.concat comme ci-dessous: -
var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']];
var flattened = [].concat.apply([],arr);
flattened
sera votre tableau attendu.
Une solution récursive pour un aplatissement profond (imbriqué):
function flatten(a) {
return Array.isArray(a) ? [].concat.apply([], a.map(flatten)) : a;
}
Un peu plus compact avec ES6:
var flatten = a => Array.isArray(a) ? [].concat(...a.map(flatten)) : a;
Pour le plaisir, utiliser un générateur nommé F
pour "aplatir", pour générer paresseusement des valeurs aplaties:
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 ]
Pour ceux qui ne sont pas familiers avec les générateurs, la syntaxe yield *
renvoie les valeurs d'un autre générateur. Array.from
prend un itérateur (tel que les résultats de l'appel de la fonction de générateur) et le transforme en tableau.
Si vous n'avez besoin que d'un simple aplatissement, cela peut fonctionner:
var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']];
var flatenned = arr.reduce(function(a,b){ return a.concat(b) }, []);
Pour un aplatissement plus complexe, Lodash dispose de la fonction d'aplatissement, qui correspond peut-être à ce dont vous avez besoin: 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];
Aplatissement récursif d'un tableau:
function flatten(array) {
return !Array.isArray(array) ? array : [].concat.apply([], array.map(flatten));
}
var yourFlattenedArray = flatten([[{"_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}]]
);
log(yourFlattenedArray);
function log(data) {
document.write('<pre>' + JSON.stringify(data, null, 2) + '</pre><hr>');
}
* {font-size: 12px; }
let functional = {
flatten (array) {
if (Array.isArray(array)) {
return Array.prototype.concat(...array.map(this.flatten, this));
}
return array;
}
};
functional.flatten([0, [1, 2], [[3, [4]]]]); // 0, 1, 2, 3, 4
J'ai remarqué que les gens utilisent des récursions qui ne coûtent pas cher, en particulier avec les nouvelles normes ES6 qui nous donnent la puissance des opérateurs en propagation. Lorsque vous insérez les éléments dans le tableau principal, utilisez simplement ... et il ajoutera automatiquement des objets aplatis. Quelque chose comme
array.Push(...subarray1) // subarray1 = [object1, object2]
array.Push(...subarray2) // subarray2 = [object3]
array.Push(...subarray3) // subarray3 = [object4,object5, object6]
// output -> array = [object1, object2, object3, object4, object5, object6]
vous pouvez utiliser flat () :
const data = [ [{id:1}, {id:2}], [{id:3}] ];
const result = data.flat();
console.log(result);
// you can specify the depth
const data2 = [ [ [ {id:1} ], {id:2}], [{id:3}] ];
const result2 = data2.flat(2);
console.log(result2);
dans ton cas :
const data = [[{"_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}]]
const result = data.flat();
console.log(result);
var arr = [1,[9,22],[[3]]];
var res = [];
function flatten(arr){
for(let i=0;i<arr.length;i++){
if(typeof arr[i] == "number"){
res.Push(arr[i]);
}
else if(typeof arr[i] == "object"){
fatten(arr[i]);
}
}
}
Fonction d'appel
flatten(arr);
console.log(res);
Résultat
[1, 9, 22, 3]
let nestedArray = [[1, 2], [3, 4], [5, 6]];
let flattenArray = function(nestedArray) {
let flattenArr = [];
nestedArray.forEach(function(item) {
flattenArr.Push(...item);
});
return flattenArr;
};
console.log(flattenArray(nestedArray)); // [1, 2, 3, 4, 5, 6]