2015-03-20 17 views
13

Ich habe ein Array, das mehrere Arrays enthält, die jeweils mehrere Objekte enthalten, ähnlich wie diese.JavaScript flacht ein Array von Arrays von Objekten

[[object1, object2],[object1],[object1,object2,object3]] 

Hier ist ein Screenshot des Objekts auf der Konsole protokolliert.

Was wäre der beste Ansatz, um dies zu reduzieren, so dass es nur eine Reihe von Objekten?

Ich habe schon versucht, diese ohne Glück:

console.log(searchData); 
    var m = [].concat.apply([],searchData);  
console.log(m); 

search den Screenshot oben abmeldet, aber m abmeldet []

Hier ist der eigentliche Inhalt von search:

[[{"_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}]] 
+7

Ich mag 'arr.reduce (function (a, b) {return a.concat (b);});' – dandavis

+0

aus irgendeinem Grund, der mich ein leeres [] gibt. Mehrere andere Methoden, die ich ausprobiert habe, haben auch ... Ich weiß nicht warum? – byrdr

+2

Sie tun etwas anderes falsch, wenn alle angebotenen Optionen nicht funktionieren. – dandavis

Antwort

21

Sie können Array.concat wie folgt verwenden: -

var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']]; 
var flattened = [].concat.apply([],arr); 

flattened wird Ihre erwartete Array sein.

+0

Aus irgendeinem Grund gibt dies ein leeres Array zurück. Irgendwelche Ideen, warum das passieren könnte? – byrdr

+0

ich mag das sogar besser als meine Antwort zu reduzieren. – dandavis

+0

können Sie dies einfach in der Konsole versuchen. für mich funktioniert es gut – Mritunjay

3

Wenn Sie nur einfache Flatten benötigen, kann dies funktioniert:

var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']]; 
var flatenned = arr.reduce(function(a,b){ return a.concat(b) }, []); 

Für komplexere Abflachung hat Lodash die Flatten-Funktion, die vielleicht, was Sie brauchen: 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]; 
+0

gutes Beispiel dafür, warum man [] .reduce vs _.flatten vorzieht! – dandavis

+0

@dandavis Nun, alles, was er tun muss, ist das optionale Argument zu '_.flatten' anzugeben, um das tiefe Verhalten zu erhalten, oder' _.flattenDeep' aufzurufen. –

2

Recursively ein Abflachen Array:

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

+1

Das hat funktioniert! danke, ich muss den Code sezieren. Also warum funktioniert dieser, wenn die anderen nicht? – byrdr

+1

Etwas vage TROCKEN beim zweimaligen Überprüfen der Array-Ness. –

+0

@bydrr: Die anderen Antworten funktionieren gut, es sei denn, Sie haben die Daten falsch dargestellt. –

8

Eine rekursive Lösung für tiefe (verschachtelte) Abflachung:

function flatten(a) { 
    return Array.isArray(a) ? [].concat.apply([], a.map(flatten)) : a; 
} 

Ein bisschen kompakter mit ES6:

var flatten = a => Array.isArray(a) ? [].concat(...a.map(flatten)) : a; 

Für Spaß, einen Generator namens F für "abzuflachen" verwenden, um träge erzeugen flachgedrückte Werte:

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 ] 

Für diejenigen, die Generat nicht kennen Oder die yield * Syntax liefert Werte von einem anderen Generator. Array.from nimmt einen Iterator (z. B. die Ergebnisse des Aufrufs der Generatorfunktion) und wandelt ihn in ein Array um.

+0

ES6 Fiddle http://www.es6fiddle.net/i7h1wlqi/ –

2
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 
+1

Diese Antwort ist ECMAScript 2015, die nicht durch das Tag [tag: javascript] abgedeckt wird, es sei denn, das entsprechende Tag wurde an die Tagliste dieser Frage angehängt, a traditionelle JavaScript-Antwort wird erwartet. –

Verwandte Themen