2017-07-28 7 views
2

Es ist ein Objekt wie dieses ...JS: Bestell Iteration des Objekts

{ 
    2016: { 
    3 : [ 
     { field: "content 1" } 
     { field: "content 2" } 
    ] 
    10 : [ 
     { field: "content 3" } 
    ] 
    } 
    2017: { 
    8 : [ 
     { field: "content 4" } 
    ] 
    } 
} 

... und ich brauche den Zugang zu den Subelementen in aufsteigender Reihenfolge zu erhalten. Das heißt, ich möchte zuerst das Objekt 2016 und dann das Objekt 2017 bearbeiten.

Darin muss ich die Monatsobjekte auch in aufsteigender Reihenfolge bearbeiten.

Iteration wie ...

for (var year in map) { 
    if (map.hasOwnProperty(year)) { 
     console.log(year) 
    } 
} 

wird den Job nicht richtig machen.

+0

Es gibt keine Ordnung in Objekten ist, dann würden Sie Ihre eigene Karte und folgen Sie, dass erstellen müssen. – adeneo

+0

javascript kann Karten nicht sortieren sorry, Sie müssen etwas wie das Hinzufügen einer zusätzlichen Eigenschaft in Ihren Objekten wie '2016: {Jahr: 2016, ...}' dann die Karte in ein Array konvertieren und dann sortieren Array nach Jahren –

Antwort

0

Javascript-Objekte sind nicht geordnet, also müssen Sie zuerst die Schlüssel ergreifen, sortieren und dann in dieser Reihenfolge durchlaufen.

data = { 
 
     2016: { 
 
     3 : [ 
 
      { field: "content 1" }, 
 
      { field: "content 2" }, 
 
     ], 
 
     10 : [ 
 
      { field: "content 3" }, 
 
     ], 
 
     }, 
 
     2017: { 
 
     8 : [ 
 
      { field: "content 4" }, 
 
     ], 
 
     }, 
 
    }; 
 
    
 
    var keys = Object.keys(data); 
 
    var sortedKeys = keys.sort(function(a, b) {return parseInt(a) - parseInt(b)}); 
 
    
 
    for (var i = 0; i < sortedKeys.length; i++) { 
 
     var key = sortedKeys[i]; 
 
     console.log(data[key]); 
 
    }

2

Um eine geordnete Anordnung des Inhalts zu erhalten, rekursiv das Objekt iterieren, während die Daten von sortierten Schlüssel bekommen und Array # concat mit dem Array zu glätten.

var data = {"2016":{"3":[{"field":"content 1"},{"field":"content 2"}],"10":[{"field":"content 3"}]},"2017":{"8":[{"field":"content 4"}]}}; 
 

 
function iterateByOrder(data) { 
 
    var sorterKeys = Object.keys(data).sort(function(a, b) { 
 
    return a - b; // sort by converting the keys to numbers 
 
    }); 
 
    
 
    return [].concat.apply([], sorterKeys.map(function(key) { // mapping the propeties to values, and flatting sub arrays 
 
    return typeof data[key] === 'object' ? iterateByOrder(data[key]) : data[key]; 
 
    })); 
 
} 
 

 
var result = iterateByOrder(data); 
 

 
console.log(result);

2

Wir werden ein wenig Analogon von Array#forEach, schreiben die iteriert über den Schlüssel/Wert-Paare in einem Objekt in sortierter Reihenfolge, und eine Funktion für jedes Paar ruft es den Schlüssel vorbei und sein Wert:

function forEach(object, fn) { 
    object.entries() . sort((a, b) => a[0] - b[0]) . forEach(pair => fn(...pair)); 
} 

Wenn Sie nicht über Object#entries, die Schreib it yourself:

function objectEntries(object) { 
    return Object.keys(object) . map(key => [key, object[key]]); 
} 

Jetzt über Ihr Objekt iterieren:

forEach(map, (year, yearValue) => 
    forEach(yearValue, (month, monthValue) => 
    console.log(`At ${year}/${month}, got data ${monthValue}`))); 
Verwandte Themen