如何按键组合数组中的值?

How to combine values in array by key?

我有这样的数据:

data = [
  [
    {"name":"cpumhz","data":[[1433856538,0],[1433856598,0]]},
    {"name":"mem","data":[[1433856538,13660],[1433856598,13660]]}
  ],
  [
    {"name":"cpumhz","data":[[1433856538,0],[1433856598,0]]},
    {"name":"mem","data":[[1433856538,13660],[1433856598,13660]]}
  ],
  [
    {"name":"cpumhz","data":[[1433856538,0],[1433856598,0]]},
    {"name":"mem","data":[[1433856538,13660],[1433856598,13660]]}
  ]
];

我如何使用 map 来组合数组项以便 data 属性被串联起来?

像这样:

data = [
  [
    {"name":"cpumhz","data":[[1433856538,0],[1433856598,0],[1433856538,0],[1433856598,0], [1433856538,0],[1433856598,0]]},
    {"name":"mem","data":[[1433856538,13660],[1433856598,13660], [1433856538,13660],[1433856598,13660], [1433856538,13660],[1433856598,13660]]}
  ]
];

通过像这样以非编程方式进行操作,我越来越接近了:

res = []

cpudata = _.flatten([data[0][0].data, data[1][0].data, data[2][0].data])
res.push({name: 'cpumhz', data: cpudata})

memdata = _.flatten([data[0][1].data, data[1][1].data, data[2][1].data])
res.push({name: 'mem', data: memdata})

http://jsbin.com/bekodirili/7/edit

考虑使用 reduce 函数。 Underscore/lodash 具有相同的功能。

本质上,您想将 data 减少 到 1 个具有 2 个值的数组。像下面这样的东西应该可以工作:

var reducedData = data.reduce(function(prev, cur) {
    prev.forEach(function(value, index) {
        value.data = value.data.concat(cur[index].data);
    });

    return prev;
});

您检查 data 中的每个值并 reduce 它。您将先前的子数据与当前的子数据和 return 新值连接起来。

使用 lodash,你可以这样做:

_(data)
    .flatten()
    .groupBy('name')
    .reduce(function(result, item, key) {
        return result.concat([{
            name: key,
            data: _.flatten(_.pluck(item, 'data'))
        }]);
    }, []);

您使用flatten() to create an array that can then be grouped into an object, based on the name value using groupBy()。此时,您有一个具有两个属性的对象 - cpuhzmem.

现在很容易reduce()将对象放入你想要的数组中。