我有一个这样的数组:
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>
感谢。
答案 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);