使用lodash转动数据

时间:2017-08-18 02:15:32

标签: javascript arrays json lodash

我需要将init数组转换为最终数组,最好使用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
      ]
   }
]

2 个答案:

答案 0 :(得分:4)

这种方式似乎对我来说是有意义的。

// 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 :(得分:1)

您可以使用reduce展平原始数组,以便所有数据数组都处于同一级别。然后使用_.transform获取临时对象,将颜色映射到其计数数组。然后你可以使用forEach将事情推送到finalArray。

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>