如何按键组合数组中的值?
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})
考虑使用 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()。此时,您有一个具有两个属性的对象 - cpuhz
和 mem
.
现在很容易reduce()将对象放入你想要的数组中。
我有这样的数据:
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})
考虑使用 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()。此时,您有一个具有两个属性的对象 - cpuhz
和 mem
.
现在很容易reduce()将对象放入你想要的数组中。