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

时间:2015-06-09 16:44:13

标签: javascript angularjs underscore.js lodash

我的数据如下:

data

我如何使用map来组合数组项,以便连接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})

通过非编程方式这样做我越来越近了:

{{1}}

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

2 个答案:

答案 0 :(得分:4)

查看使用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 。使用当前子数据连接先前的子数据并返回新值。

答案 1 :(得分: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()对象放入你想要的数组中。