如何使用相同的键值对对象数组求和

时间:2016-12-02 00:55:50

标签: javascript jquery

我有一个像这样的对象数组:

var original_db = [
            {date_diff:"2016/10/31", date_number:1,hangup_cause:"NORMAL_CLEARING"},
{date_diff:"2016/10/31", date_number:1,hangup_cause:"NORMAL_CLEARING"},
{date_diff:"2016/10/31", date_number:1,hangup_cause:"NO_ANSWER"},
{date_diff:"2016/10/31", date_number:1,hangup_cause:"ORIGINATOR-CANCEL"},
{date_diff:"2016/10/30", date_number:2,hangup_cause:"NORMAL_CLEARING"},
{date_diff:"2016/10/30", date_number:2,hangup_cause:"NO_ANSWER"},
{date_diff:"2016/10/30", date_number:2,hangup_cause:"NO_ANSWER"},
{date_diff:"2016/10/30", date_number:2,hangup_cause:"NO_ANSWER"},
{date_diff:"2016/10/29", date_number:3,hangup_cause:"NORMAL_CLEARING"},
{date_diff:"2016/10/29", date_number:3,hangup_cause:"ORIGINATOR-CANCEL"},
{date_diff:"2016/10/29", date_number:3,hangup_cause:"ORIGINATOR-CANCEL"},
        ];

这是我的预期结果:

result : 
[
{date_diff : "2016/10/31", NORMAL_CLEARING : 2, NO_ANSWER : 1, ORIGINATOR-CANCEL : 1},
{date_diff : "2016/10/30", NORMAL_CLEARING : 1, NO_ANSWER : 3},
{date_diff : "2016/10/29", NORMAL_CLEARING : 1, ORIGINATOR-CANCEL : 2}
]

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

for循环的每次迭代中,检查“date_number”是否与上一次迭代相同。

如果它不是同一个日期,push()数组中的对象并重置它。

此代码段正在运行。

var original_db = [
    {date_diff:"2016/10/31", date_number:1,hangup_cause:"NORMAL_CLEARING"},
    {date_diff:"2016/10/31", date_number:1,hangup_cause:"NORMAL_CLEARING"},
    {date_diff:"2016/10/31", date_number:1,hangup_cause:"NO_ANSWER"},
    {date_diff:"2016/10/31", date_number:1,hangup_cause:"ORIGINATOR-CANCEL"},
    {date_diff:"2016/10/30", date_number:2,hangup_cause:"NORMAL_CLEARING"},
    {date_diff:"2016/10/30", date_number:2,hangup_cause:"NO_ANSWER"},
    {date_diff:"2016/10/30", date_number:2,hangup_cause:"NO_ANSWER"},
    {date_diff:"2016/10/30", date_number:2,hangup_cause:"NO_ANSWER"},
    {date_diff:"2016/10/29", date_number:3,hangup_cause:"NORMAL_CLEARING"},
    {date_diff:"2016/10/29", date_number:3,hangup_cause:"ORIGINATOR-CANCEL"},
    {date_diff:"2016/10/29", date_number:3,hangup_cause:"ORIGINATOR-CANCEL"},
];
  
var resultArr = [];
var resultObj = {};
var date_number = 1;

for (i=0; i<original_db.length; i++) {
    
    // If the "date_number" changed, push the object to array.
    if (date_number != original_db[i]["date_number"]){
        date_number = original_db[i]["date_number"]
        resultArr.push(resultObj);
        resultObj = {};
    }
    
    // Count add each "hangup_cause" and its count
    resultObj["date_diff"] = original_db[i]["date_diff"];
    var value = original_db[i]["hangup_cause"]; 
    var count = (resultObj[value] || 0) + 1; 
    resultObj[value] = count;
}

// Push the last object at the end of the loop
resultArr.push(resultObj);

// Show it in console.
console.log(JSON.stringify(resultArr))