2016-09-07 3 views
-2

Ich habe eine JSON-Datei mit der folgenden Struktur:JSON-Daten auf Basis von JSON und Array vorbereiten - JavaScript

{ ShippingDate: '06.09.2016', 
    'Order ID': 200003946, 
    ID: 751, 
    Product: 'Mobile Phone'}, 
    { ShippingDate: '06.09.2016', 
    'Order ID': 200003946, 
    ID: 751, 
    Product: 'TV'}, 
    { ShippingDate: '06.09.2016', 
    'Order ID': 200003946, 
    ID: 751, 
    Product: 'Batteries'}, 
    { ShippingDate: '06.09.2016', 
    'Order ID': 200003926, 
    ID: 752, 
    Product: 'Car'}, 

So sind die ersten drei Einträge ein Auftrag des gleichen Kunden. Die vierte ist eine Bestellung eines anderen Kunden.

Ich weiß, wollen eine lenker.js Vorlage verwenden, um eine HTML-Datei mit jeder Bestellung einschließlich der Artikel der Bestellung hat. So bereitete ich diese Vorlage:

<div class="header"> 
    <h1>{{ID}}</h1> 
</div> 
<div class="body"> 
    <ul> 
     {{#each Product}} 
     <li>{{this}}</li> 
     {{/each}} 
    </ul> 
</div> 

ich jetzt das Problem haben, dass ich diese Art von Daten für die Vorlage vorbereiten müssen. Und hier bin ich auf einige Probleme gestoßen. Mein Code geht so

... 
var f = fs.readFileSync('data.json').toString(); 
var lines = JSON.parse(f); 
var items = []; 
//prepare products of one customer and put them into an array 
for (var key in lines) { 

    var line = lines[key]; 
    var nextLine = lines[(parseInt(key)+1)]; 

    if (nextLine !== undefined && line !== undefined) { 
    if (line['Order ID'] !== nextLine['Order ID']) { 
     items.push('Product: ' + line.Product); 
    }//if 
    }//if 
}//for 

var data = lines; 
fs.readFile(template.html, 'utf-8', function(error, source){ 
    var template = handlebars.compile(source); 
    var html = template(data); 
    console.log(html) 
}); 

Dies funktioniert nicht - wie kann ich meine Array von Elementen vorzubereiten, so dass ich diese Produkte mit den Produkten Variable in meiner Vorlage zugreifen kann? Zusätzlich muss ich der JSON-Zeichenfolge Informationen wie ID und Versanddatum hinzufügen. Das Datenformat muss so aussehen:

var data = { 
    ShippingDate: '06.09.2016', 
    ID: '751', 
    Product: ['Mobile Phone', 'TV', 'Batteries'] 
} 

Kann hier jemand helfen?

+0

Mögliche Duplikat [Zugang/Prozess (verschachtelte) Objekte, Arrays oder JSON] (http://stackoverflow.com/questions/11922383/access-process -nested-objects-arrays-or-json) – Liam

Antwort

1

Hier ist ein Weg, es zu tun:

var data = [{ 
    "ShippingDate": "06.09.2016", 
    "Order ID": 200003946, 
    "ID": 751, 
    "Product": "Mobile Phone" 
}, { 
    "ShippingDate": "06.09.2016", 
    "Order ID": 200003946, 
    "ID": 751, 
    "Product": "TV" 
}, { 
    "ShippingDate": "06.09.2016", 
    "Order ID": 200003946, 
    "ID": 751, 
    "Product": "Batteries" 
}, { 
    "ShippingDate": "06.09.2016", 
    "Order ID": 200003926, 
    "ID": 752, 
    "Product": "Car" 
}]; 

var newData = {}; 

data.forEach(function(item) { 
    if (typeof newData[item.ID] === 'undefined') { 
     newData[item.ID] = { 
      ShippingDate: item.ShippingDate, 
      ID: item.ID, 
      Product: [] 
     }; 
    } 

    newData[item.ID].Product.push(item.Product); 
}); 

newData = Object.values(newData); 
+0

Danke @vincent - hast du auch ein Beispiel in JavaScript? – Torben

+0

@Torben, ich habe meine Antwort aktualisiert und ein js-Beispiel hinzugefügt. – vincenth

+0

Vielen Dank. Das bringt mich voran. Eine Frage allerdings. Ich habe jetzt dasselbe implementiert wie du. Das Ergebnis ist: { '200003908': {Liefertermin: '06 .09.2016' , ID: 200003946, Produkt: [ 'Handy', 'TV', 'Batterien']}} Wie kann ich es ändern, so dass die erste Ebene mit der ID ist weg und das Ergebnis ist nur: {Versanddatum: '06 .09.2016 ', ID: 200003946, Produkt: [' Handy ', ' TV ', ' Batterien '}} Das ist, was ich suche. Vielen Dank für Ihre Hilfe, mein Gehirn ist eingefroren:/ – Torben

Verwandte Themen