繁体   English   中英

JavaScript:对对象数组中的项目进行分组和求和

[英]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 countcount数值分组,如下所示:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM