我有这个数组结构,其中$arr[5]
索引我有一个值,表示我的数组$ arr的每个对象的出现次数:
$arr=[
[
"some_value",
"some_value",
"cluster_0",
"area_2",
"some_value",
"1"
],
[
"some_value",
"some_value",
"cluster_0",
"area_2",
"some_value",
"2"
],
[
"some_value",
"some_value",
"cluster_0",
"area_3",
"some_value",
"1"
],
[
"some_value",
"some_value",
"cluster_1",
"area_3",
"some_value",
"3"
],
[
"some_value",
"some_value",
"cluster_1",
"area_4",
"some_value",
"2"
],
[
"some_value",
"some_value",
"cluster_1",
"area_4",
"some_value",
"2"
]
];
我想要获得的是将$arr[5]
(群集)和$arr[2]
(区域)分组的$arr[3]
值中的每一个相加。
$res=[
[
"cluster_0",
"area_2",
3
],
[
"cluster_0",
"area_3",
1
],
[
"cluster_1",
"area_3",
3
],
[
"cluster_1",
"area_4",
4
]
];
正如您所看到的,我根据区域和群集匹配得到了该特定值的总和。在javascript中有没有什么好方法可以执行这种操作?我想到了一个简单的 for循环,并且在循环内部总和的if条件只是共享相同$arr[2]
(群集)和$arr[3]
(区域)的值值。
答案 0 :(得分:3)
您可以获取组的索引和值索引,并使用组作为哈希键生成新的结果集。然后将值添加到组中。
function groupBy(array, groups, value) {
var result = [],
hash = Object.create(null);
array.forEach(function (a) {
var keys = groups.map(function (i) { return a[i] }),
key = keys.join('|');
if (!hash[key]) {
hash[key] = keys.concat(0);
result.push(hash[key]);
}
hash[key][hash[key].length - 1] += +a[value];
});
return result;
}
var array = [["some_value", "some_value", "cluster_0", "area_2", "some_value", "1"], ["some_value", "some_value", "cluster_0", "area_2", "some_value", "2"], ["some_value", "some_value", "cluster_0", "area_3", "some_value", "1"], ["some_value", "some_value", "cluster_1", "area_3", "some_value", "3"], ["some_value", "some_value", "cluster_1", "area_4", "some_value", "2"], ["some_value", "some_value", "cluster_1", "area_4", "some_value", "2"]],
result = groupBy(array, [2, 3], 5);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
还要考虑这个解决方案,
var data = $arr.reduce(function(acc, item) {
var clusterName = item[2],
areaName = item[3];
acc[clusterName] = acc[clusterName] || {};
acc[clusterName][areaName] = acc[clusterName][areaName] || 0;
acc[clusterName][areaName] += parseInt(item[5]);
return acc;
}, {});
console.log(data);
var array = Object.keys(data).reduce(function(acc, clusterItem) {
Object.keys(data[clusterItem]).forEach(function(areaItem) {
var item = [];
item.push(clusterItem);
item.push(areaItem);
item.push(data[clusterItem][areaItem]);
acc.push(item);
});
return acc;
}, []);
console.log(array);
在第一步,计算所有项目并将其添加到对象中。第二个将对象转换为所需的结构(数组)。