[英]JavaScript: Group and sum items in array of objects
取下面的对象数组myData
:它的当前输出是:
console.log(myData);
Object { mins: 10, name: "N/A", label: "UK GEO", count: "10", id: "015" }
Object { mins: 10, name: "N/A", label: "UK GEO", count: "10", id: "012" }
Object { mins: 10, name: "N/A", label: "UK GEO", count: "10", id: "022" }
Object { mins: 28, name: "N/A", label: "0330", count: "63", id: "033" }
Object { mins: 17, name: "3pp", label: "Free", count: "49", id: "080" }
Object { mins: 10, name: "5pp", label: "SC006", count: "23", id: "087" }
所需的输出应按label
和总mins
count
和count
数值分组,如下所示:
Object { mins: 30, name: "N/A", label: "UK GEO", count: "30", id: "022" }
Object { mins: 28, name: "N/A", label: "0330", count: "63", id: "033" }
Object { mins: 17, name: "3pp", label: "Free", count: "49", id: "080" }
Object { mins: 10, name: "5pp", label: "SC006", count: "23", id: "087" }
问:我怎样才能达到上述期望的输出?
您可以使用数组方法实现此目的
和一点点类型转换。
// reduceRight so that the latest id is in the output (instead of the first)
var output = input.reduceRight(function (a, b) {
// locate existing key (if any)
var k = a.filter(function (e) { return (e.label === b.label) })[0];
if (k !== undefined) {
// update object
k.name = "N/A";
k.mins += b.mins;
k.count += +b.count;
}
else {
// coerce to nubmer
b.count = +b.count;
// insert new object
a.push(b)
}
return a;
}, []).reverse();
// we need the reverse because we do a reduceRight
请注意,输出计数是一个数字(不是字符串),如果您想要一个数字,您可以通过删除b.count = +b.count;
轻松地做到这b.count = +b.count;
并更新k.count += +b.count;
to k.count = String(+k.count + +b.count);
堆栈片段
var input = [ { mins: 10, name: "N/A", label: "UK GEO", count: "10", id: "015" }, { mins: 10, name: "N/A", label: "UK GEO", count: "10", id: "012" }, { mins: 10, name: "N/A", label: "UK GEO", count: "10", id: "022" }, { mins: 28, name: "N/A", label: "0330", count: "63", id: "033" }, { mins: 17, name: "3pp", label: "Free", count: "49", id: "080" }, { mins: 10, name: "5pp", label: "SC006", count: "23", id: "087" }, ] var output = input.reduceRight(function (a, b) { var k = a.filter(function (e) { return (e.label === b.label) })[0]; if (k !== undefined) { k.name = "N/A"; k.mins += b.mins; k.count += +b.count; } else { b.count = +b.count; a.push(b) } return a; }, []).reverse(); so.log(output)
body { font-family: verdana; font-size: 10px; }
<div id="a"></div> <script> var so = { log: function(e) { document.getElementById("a").innerText = JSON.stringify(e, null, ' '); } } </script>
或者只是基本循环。 您应该已经了解循环的本质。
var newArr = [];
for (i = 0; i < myData.length; i++) {
var found = false;
for (newArrIterator = 0; newArrIterator < i; newArrIterator++) {
if (newArr[newArrIterator] && newArr[newArrIterator].label === myData[i].label) {
newArr[newArrIterator].count = (parseInt(newArr[newArrIterator].count) + parseInt(myData[i].count)).toString()
newArr[newArrIterator].mins = parseInt(newArr[newArrIterator].mins) + parseInt(myData[i].mins)
newArr[newArrIterator].name = "N/A"
found = true
}
}
if (!found) {
newArr.push(myData[i]);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.