2016-04-19 7 views
1

Ich weiß, dass dies sehr einfach sein sollte, aber ich kann einfach nicht, dass dieses Ding zu arbeiten. Ich habe ein Objekt, das die folgende Struktur hat:Abfrage eindeutige Werte aus dem JSON

"name": "Machine 1", 
"categories": [ 
    { 
    "name": "Planned", 
    "days": [ 
     { 
     "id": 0, 
     "date": "2015-09-14T00:00:00", 
     "time": 768 
     }, 
     { 
     "id": 0, 
     "date": "2015-09-15T00:00:00", 
     "time": 1100 
     }, 
     { 
     "id": 0, 
     "date": "2015-09-16T00:00:00", 
     "time": 356 
     } 
    ] 
    }, 
    { 
    "name": "Item 1", 
    "days": [ 
     { 
     "id": 0, 
     "date": "2015-09-14T00:00:00", 
     "time": 1323 
     }, 
     { 
     "id": 0, 
     "date": "2015-09-15T00:00:00", 
     "time": 1475 
     }, 
     { 
     "id": 0, 
     "date": "2015-09-16T00:00:00", 
     "time": 668 
     } 
    ] 
    }, 

Also, wenn ich es in einem Baum wie Struktur angezeigt werden soll, würde das zurückgegebene Objekt so aussieht

  • Array von Maschinen
    • Jede Maschine hat Array von Kategorien
      • jede Kategorie hat eine Liste von Tage

Was ich versuche, statt meiner aktuellen Ansatz (manuelle Iteration)

  angular.forEach(machine.categories, function (category, index) { 
       angular.forEach(category.days, function (day, index) { 
        newData.labels.push(day.date); 
       }); 
      }); 

verwenden zu tun, um eine bereits bestehende Bibliothek (basierend auf meiner Forschung, underscore.js sollte eine perfekte Passform dafür sein) und es richtig zu tun (Ich versuche zu lernen, wie man damit arbeitet).

Also was ich versuche zu erreichen, ist eine Liste von einzigartigen Tagen im Datumsformat zu bekommen. So würde meine resultierende Objekt wie folgt aussehen:

var result = ["2015-09-14", "2015-09-15", "2015-09-16"] (dieses wäre besser)

Gibt es eine Möglichkeit, wie man es tun mit der Bibliothek (dh ohne manuelle Iteration)?

Antwort

2

Sie könnten Set für eindeutige Werte verwenden

var data = { "name": "Machine 1", "categories": [{ "name": "Planned", "days": [{ "id": 0, "date": "2015-09-14T00:00:00", "time": 768 }, { "id": 0, "date": "2015-09-15T00:00:00", "time": 1100 }, { "id": 0, "date": "2015-09-16T00:00:00", "time": 356 }] }, { "name": "Item 1", "days": [{ "id": 0, "date": "2015-09-14T00:00:00", "time": 1323 }, { "id": 0, "date": "2015-09-15T00:00:00", "time": 1475 }, { "id": 0, "date": "2015-09-16T00:00:00", "time": 668 }] }] }; 
 

 
var set = new Set(); 
 

 
data.categories.forEach(e => e.days.forEach(e => set.add(e.date))); 
 

 
document.write('<pre>' + JSON.stringify(Array.from(set)) + '</pre>');

+0

es vielleicht ist keine Unterstreichungsfunktion (oder ist es?), aber das ist genau das, was ich gesucht habe –

+0

Ist es auch möglich, diesen Wert zu formatieren, wenn er einem bestimmten Datumsformat hinzugefügt wird? Z.B. 'dd.MM.yyyy'? –

+0

@RobertJ. Es ist einfaches JavaScript, Sie brauchen keinen Unterstrich für diese Aufgabe. Ja, Sie können diese Daten formatieren, Sie sehen dies [doc] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) – isvforall

1

Mit Strich (Bit ausführlich, vorausgesetzt, Sie Ihre JSON in einer Variablen analysiert data genannt):

var result = _.uniq(
       _.flatten(
       _.map(data.categories, function(category) { 
        return _.map(_.pluck(category.days, 'date'), function(date) { 
        return date.replace(/T\d+:\d+:\d+$/, ''); 
       }); 
      }))); 
Verwandte Themen