按多个元素分组Jquery数组并查找总

时间:2018-02-27 20:41:44

标签: javascript jquery arrays grouping

我有一个这样的数组:

abcArr = [["A", "dog", 10], ["B", "cat", 20], ["A", "dog", 30],["C", "pig", 40]] ["A", "cat", 30],  ["B", "cat", 20], ["A", "horse", 10];

我正在看这篇文章(jquery array group by),我需要类似的问题,但我需要根据2个元素对数组进行分组。

所以我的答案应该是这样的:

[["A", "dog", 40], ["B", "cat", 40], ["C", "pig", 40]] ["A", "cat", 30], ["A", "horse", 10];

我试过@jfriend00的.each()方法只对一个字段进行分组并且它有效,但我不知道如何调整它以使用两个字段对上面的数据进行分组。

abcArr = [["A", 10],["B", 20],["A", 30],["C", 40]];
var items = {},
  base, key;
$.each(abcArr, function(index, val) {
  key = val[0];
  if (!items[key]) {
    items[key] = 0;
  }
  items[key] += val[1];
});
var outputArr = [];
$.each(items, function(key, val) {
  outputArr.push([key, val]);
});

console.log(outputArr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

感谢。

1 个答案:

答案 0 :(得分:1)

您可以做的是,您可以组合多个键,而不是将一个字段用作items对象的键,如下所示:

注意 - jQuery不是解决此问题的必要条件,因为JavaScript具有内置的.reduce().map()函数。

var abcArr = [["A", "dog", 10], ["B", "cat", 20], ["A", "dog", 30],["C", "pig", 40], ["A", "cat", 30],  ["B", "cat", 20], ["A", "horse", 10]];

// group the items by letter-animal and sum the results
var items = abcArr.reduce(function (results, current) {
  var letter = current[0];
  var animal = current[1];
  var value = current[2];
  
  // combine the two fields as the key to match on.. this is where the magic happens
  var key = letter + "-" + animal;
  if (!results[key]) {
    results[key] = 0;
  }
  results[key] += value;
  return results;
}, {});

// break the keys out from the hyphenated form back into individual array elements w/ value
var outputArr = Object.keys(items).map(function (key) {
  var splitKey = key.split("-");
  var letter = splitKey[0];
  var animal = splitKey[1];
  var itemValue = items[key];
  
  return [letter, animal, itemValue];
});

console.log(outputArr);

或者使用ES6语法:

var abcArr = [["A", "dog", 10], ["B", "cat", 20], ["A", "dog", 30],["C", "pig", 40], ["A", "cat", 30],  ["B", "cat", 20], ["A", "horse", 10]];

var items = abcArr.reduce((results, [letter, animal, value]) => {
  var key = letter + "-" + animal;
  if (!results[key]) {
    results[key] = 0;
  }
  results[key] += value;
  return results;
}, {});

var outputArr = Object.keys(items).map(key => [...key.split("-"), items[key]]);

console.log(outputArr);