web-dev-qa-db-fra.com

JavaScript aplatissant un tableau de tableaux d'objets

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}]]
17
byrdr

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.

33
Mritunjay

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.

10
user663031

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];
4
Huy Hoang Pham

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; }

2
Miguel Mota
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
2
Alexander Abashkin

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]
1
Adnan Khan

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);

0
Taki
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]
0
Gajender Singh

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]

0
Tarun Majumder