由数组内的其他值分组的特定值的总和

时间:2017-11-13 22:17:06

标签: javascript jquery arrays

我有这个数组结构,其中$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](区域)的值值。

2 个答案:

答案 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);

在第一步,计算所有项目并将其添加到对象中。第二个将对象转换为所需的结构(数组)。