2017-09-25 3 views
0

Ich habe die Struktur folgende Daten:die Daten transformieren

const data = [ 
    { 
    name: 'ABC', 
    salesData: [ 
     { 
     timestamp: '2017-09-01', 
     value: 10 
     }, 
     { 
     timestamp: '2017-09-02', 
     value: 2 
     } 
    ] 
    }, 
    { 
    name: 'DEF', 
    salesData: [ 
     { 
     timestamp: '2017-09-01', 
     value: 8 
     }, 
     { 
     timestamp: '2017-09-02', 
     value: 3 
     } 
    ] 
    } 
]; 

Ich möchte dies verwandeln:

[ 
    { 
    name: 'ABC', 
    '2017-09-01': 10, 
    '2017-09-02': 2 
    }, 
    { 
    name: 'CDE', 
    '2017-09-01': 8, 
    '2017-09-02': 3 
    } 
] 

Ich versuche Undersketten und Karte zu verwenden, die ich erhalte verwirrt. Bisher habe ich die folgenden, nicht sicher, wie schreibe ich den convertedSalesData als je die Notwendigkeit zu transformieren:

_.map(data, function(item) { 
    let name = item.name; 
    let salesData = item.salesData; 
    let convertedSalesData = ? 
}) 
+0

ist es obligatorisch, underscoreJS zu verwenden? –

+0

Verwenden Sie [] Klammer statt. um Daten als Schlüssel zu verwenden. –

+0

@HarshPatel: Nicht wirklich, mir geht es auch mit dem einfachen Javascript. –

Antwort

2

Mit ES6 können Sie Spread-Syntax verwenden ... dieses Ergebnis zu erhalten.

const data = [{"name":"ABC","salesData":[{"timestamp":"2017-09-01","value":10},{"timestamp":"2017-09-02","value":2}]},{"name":"DEF","salesData":[{"timestamp":"2017-09-01","value":8},{"timestamp":"2017-09-02","value":3}]}] 
 

 

 
var result = data.map(function({name, salesData}) { 
 
    return {name, ...Object.assign({}, ...salesData.map(({timestamp, value}) => ({[timestamp]: value})))} 
 
}) 
 
console.log(result)

+0

Sieht perfekt aus und die Verwendung von ES6, um das Ergebnis zu erzielen, ist großartig. Danke, dass Sie den Trick geteilt haben. –

+0

Gern geschehen. –

2

const data = [{ 
 
    name: 'ABC', 
 
    salesData: [{ 
 
     timestamp: '2017-09-01', 
 
     value: 10 
 
     }, 
 
     { 
 
     timestamp: '2017-09-02', 
 
     value: 2 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    name: 'DEF', 
 
    salesData: [{ 
 
     timestamp: '2017-09-01', 
 
     value: 8 
 
     }, 
 
     { 
 
     timestamp: '2017-09-02', 
 
     value: 3 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
var res = data.map(function(a) { 
 
    var obj = { 
 
    name: a.name 
 
    }; 
 
    a.salesData.forEach(function(x) { 
 
    obj[x.timestamp] = x.value; 
 
    }) 
 
    return obj; 
 
}) 
 

 
console.log(res);

2

Ähnlich @Nenad Vracar. Ich benutze 'reduce':

data.map(({ name, salesData }) => ({ 
    name, 
    ...salesData.reduce(
    (record, { timestamp, value }) => { 
     record[timestamp] = value 
     return record 
    }, 
    Object.create(null) 
) 
})) 
+0

Ich denke, wir können '{}' direkt anstelle von 'Object.create (null)' verwenden. Das gleiche ist – RamaKrishna

+0

Ich empfehle die Verwendung von Object.create (null), wenn Sie nur ein einfaches Objekt zum Speichern von k/v-Paaren benötigen. Diese '{}', die auf diese Weise erzeugt werden, erben nichts von Object.prototype. Wenn Sie Dinge auf dem Objekt schleifen lassen, werden Sie froh sein, 'hasOwnProperty' nicht zu schreiben. – Zheeeng

Verwandte Themen