2016-12-09 4 views
3

Ich suchte über das Internet, für einige Beispiele, habe nicht eine anständige finden, die funktioniert und die einfache Aufgabe, die ich brauche, vielleicht können Sie mir dabei helfen.Javascript Objektgruppe nach Tag, Monat, Jahr

ich ein Array von Objekten haben:

[ 
    { 
    "date": "2015-01-01T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": true, 
    "size": 1024 
    }, 
    { 
    "date": "2015-01-02T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": false, 
    "size": 1024 
    }, 
    { 
    "date": "2015-02-01T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": true, 
    "isCompleted": false, 
    "size": 1024 
    }, 
    { 
    "date": "2015-02-02T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": true, 
    "size": 1024 
    }, 
    { 
    "date": "2016-04-01T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": true, 
    "isCompleted": false, 
    "size": 1024 
    }, 
    { 
    "date": "2016-04-02T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": true, 
    "size": 1024 
    } 
] 

Ich bin für eine einfache straight forward Lösung zu gruppieren sie nach Jahr suchen, dann nach Monat, dann Tag in der folgenden Art und Weise

Die Ergebnis sollte etwas sein, das ich auf wie die folgenden laufen kann:

[ 
    { 
    "2015": [ 
     { 
     "JAN": [ 
      { 
      "01": { 
       "date": "2015-01-01T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      }, 
      "02": { 
       "date": "2015-01-01T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      } 
      } 
     ], 
     "FEB": [ 
      { 
      "01": { 
       "date": "2015-02-01T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      }, 
      "02": { 
       "date": "2015-02-02T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      } 
      } 
     ] 
     }, 
    ], 
    "2016": [ 
     { 
     "APR": [ 
      { 
      "02": { 
       "date": "2016-04-02T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      } 
      } 
     ] 
     } 
    ] 
    } 
] 

der Endzweck ist durch ng-repeat mit Winkel über sie in einer Liste zu gehen.

Wenn jemand einen Vorschlag habe, bin ich sicher, dass dieser Code sehr nützlich für andere sein wird, denn es gibt kein Beispiel für eine flache Anordnung von Daten und konvertieren Sie es zu einem Objekt von Jahr, Monat und Tag, überall über das Netz .

Vielen Dank!

+0

Hallo, wo ist diese Anordnung von Objekten kommen aus? Wenn es zum Beispiel aus einer SQL-Datenbank kommt, wäre es am besten, es stromaufwärts zu sortieren – grogro

Antwort

1

Leider scheint es keine Möglichkeit, dies weiter zu reduzieren, da jede Ebene unterschiedliche Schlüssel/Wert-Anforderungen hat.

var data = [{"date":"2015-01-01T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024},{"date":"2015-01-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":false,"size":1024},{"date":"2015-02-01T12:00:00.000Z","photoUrl":"","inProgress":true,"isCompleted":false,"size":1024},{"date":"2015-02-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024},{"date":"2016-04-01T12:00:00.000Z","photoUrl":"","inProgress":true,"isCompleted":false,"size":1024},{"date":"2016-04-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024 }]; 
 
var months = [,"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]; 
 
var re = /^(\d{4})-(\d{2})-(\d{2})/; 
 
var results = data.reduce(function(results,value){ 
 
    var date = value.date.match(re); 
 
    var temp = results; 
 
    var key = date[1]; 
 
    if(!temp.hasOwnProperty(key)) temp[key] = {}; 
 
    temp = temp[key]; 
 
    key = months[date[2]|0]; 
 
    if(!temp.hasOwnProperty(key)) temp[key] = {}; 
 
    temp = temp[key]; 
 
    key = date[3]; 
 
    if(!temp.hasOwnProperty(key)) temp[key] = []; 
 
    temp = temp[key]; 
 
    
 
    temp.push(value); 
 
    return results; 
 
},{}); 
 
console.log(results);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Große Antwort! Können Sie vorschlagen, wie man mit ng-repeat iteriert? –

+0

@LiadLivnat Das klingt nach einem ausreichend großen Thema für eine andere Frage. – Ouroborus

2

Sie könnten einfach überprüfen, ob Jahr eingestellt ist und wenn nicht, weisen Sie ein Array mit einem leeren Objekt darin zu. Fahren Sie dann mit dem Monat fort und weisen Sie ihm später den Artikel zu.

var data = [{ date: "2015-01-01T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }, { date: "2015-01-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: false, size: 1024 }, { date: "2015-02-01T12:00:00.000Z", photoUrl: "", inProgress: true, isCompleted: false, size: 1024 }, { date: "2015-02-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }, { date: "2016-04-01T12:00:00.000Z", photoUrl: "", inProgress: true, isCompleted: false, size: 1024 }, { date: "2016-04-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }], 
 
    grouped = Object.create(null); 
 

 
data.forEach(function (a) { 
 
    var year = a.date.slice(0, 4), 
 
     month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'][a.date.slice(5, 7) - 1], 
 
     day = a.date.slice(8, 10); 
 

 
    grouped[year] = grouped[year] || [{}]; 
 
    grouped[year][0][month] = grouped[year][0][month] || [{}]; 
 
    grouped[year][0][month][0][day] = a; 
 
}); 
 

 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Verwandte Themen