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

3

我有这样的数据:

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

2个回答

4

建议使用reduce函数,Underscore/lodash库也有相应的函数。

主要思路是将data缩减为一个只有两个值的数组。可以尝试使用以下代码:

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

    return prev;
});

您需要遍历data中的每个值并进行归约。将前一个子数据与当前子数据连接起来并返回新值。

2
使用lodash,您可以像这样做:
_(data)
    .flatten()
    .groupBy('name')
    .reduce(function(result, item, key) {
        return result.concat([{
            name: key,
            data: _.flatten(_.pluck(item, 'data'))
        }]);
    }, []);

你可以使用flatten()创建一个数组,然后通过groupBy()基于name值将其分组为一个对象。此时,你将得到一个具有两个属性的对象—— cpuhzmem

现在很容易将对象使用reduce()转化为你所需的数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接