2017-08-18 3 views
1

Ich muss das Init-Array in End-Array vorzugsweise mit Lodash konvertieren.Pivot-Daten mit lodash

initArray = [ 
    { 
     "date":"2017-08-15", 
     "data":[ 
     { 
      "color":"orange", 
      "count":100 
     }, 
     { 
      "color":"green", 
      "count":101 
     } 
     ] 
    }, 
    { 
     "date":"2017-08-14", 
     "data":[ 
     { 
      "color":"orange", 
      "count":102 
     }, 
     { 
      "color":"green", 
      "count":103 
     } 
     ] 
    } 
] 

finalArray = [ 
    { 
     "color":"orange", 
     "data":[ 
     100, 
     102 
     ] 
    }, 
    { 
     "color":"green", 
     "data":[ 
     101, 
     103 
     ] 
    } 
] 
+0

lodash Rätsel sind Spaß und alles, aber das nächste Mal versuchen zu erklären, was Sie versucht haben, und warum es nicht funktioniert. – aaaaaa

Antwort

1

können Sie reduce verwenden, um die Original-Array zu glätten, so dass alle Datenfelder auf der gleichen Ebene sind. Verwenden Sie dann _.transform, um ein temporäres Objekt zu erhalten, das Farben auf das Array ihrer Zählwerte abbildet. und dann können Sie Dinge mit forEach zu finalArray schieben.

var initArray = [ 
 
    { 
 
    "date":"2017-08-15", 
 
    "data":[ 
 
    { 
 
     "color":"orange", 
 
     "count":100 
 
    }, 
 
    { 
 
     "color":"green", 
 
     "count":101 
 
    } 
 
    ] 
 
    }, 
 
    { 
 
    "date":"2017-08-14", 
 
    "data":[ 
 
    { 
 
     "color":"orange", 
 
     "count":102 
 
    }, 
 
    { 
 
     "color":"green", 
 
     "count":103 
 
    } 
 
    ] 
 
    } 
 
]; 
 
var finalArray = []; 
 
var temp = _.transform(initArray.reduce((a,b) => a.data.concat(b.data)), 
 
         (r, v) => (r[v.color] || (r[v.color] = [])).push(v.count), {}); 
 

 
_.forEach(temp, (v,k) => finalArray.push({color:k, count:v})); 
 

 
console.log(finalArray);
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>

+0

@ptpaterson Super! Danke –

4

Auf diese Weise scheint, wie die lodash Anrufe machen Sinn für mich.

// var _ = require('lodash') 
 

 
initArray = [ 
 
    { 
 
     "date":"2017-08-15", 
 
     "data":[ 
 
     { 
 
      "color":"orange", 
 
      "count":100 
 
     }, 
 
     { 
 
      "color":"green", 
 
      "count":101 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     "date":"2017-08-14", 
 
     "data":[ 
 
     { 
 
      "color":"orange", 
 
      "count":102 
 
     }, 
 
     { 
 
      "color":"green", 
 
      "count":103 
 
     } 
 
     ] 
 
    } 
 
] 
 

 
result = _(initArray) 
 
    //.map('data') 
 
    //.flatten() 
 
    .flatMap('data') // instead of .map('data').flatten() 
 
    .groupBy('color') 
 
    .map((item, key) => ({ 
 
     color: key, 
 
     count: _.map(item, 'count') 
 
    })) 
 
    .value() 
 

 
console.log(result)
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>

+1

Ich könnte sogar sagen, dies ist die "richtige" Art und Weise, dies zu tun, unter Berücksichtigung der Lesbarkeit und angemessene Methodenverwendung. – aaaaaa

+2

Sie können 'map ('data'). Flatten()' to 'flatMap ('data')' ändern. – ryeballar

+0

@ryeballar schön! – ptpaterson