如何将结果列表合并到具有总计的压缩对象中

时间:2013-09-02 11:25:35

标签: javascript

我正在循环一组输入。我需要统计分组总数。

var compoundedArray = new Array();

    holder.find(".dataset input").each(function(index) {
        var val = $(this).val();
        var dataType = $(this).data("type");

        var localObj = {};

        localObj[dataType] = val;
        compoundedArray.push(localObj);
    });

我有一个像这样的对象

[
    {
    "growth":30
    },
    {
    "growth": 40
    },
    {
    "other": 20
    }
]

如何遍历对象以生成类似

的内容
[
    {
        "growth": 70
    },
    {
        "other": 20
    }
]

如果我循环遍历初始数组对象

for (var i = 0; i < compoundedArray.length; i++) {
console.log(compoundedArray[i]);
}

我将如何检查以确保我没有重复项 - 并且我可以计算结果?

5 个答案:

答案 0 :(得分:0)

您可以使用for循环遍历Object。 如果要删除项目,只需将其设置为空。

示例:

for(var i in compoundedArray){
    for(var j in compoundedArray){
        if(i == j){
            compoundedArray[i] += compoundedArray[j];
            compoundedArray[j] = null;
        }
    }
}

答案 1 :(得分:0)

我认为您选择的数据结构有点过于复杂。尝试类似的东西。

var compoundedObject = {};

holder.find(".dataset input").each(function(index) {
    var val = $(this).val();
    var dataType = $(this).data("type");

    //Assuming all values are integers and can be summed:
    if( compoundedObject.hasOwnProperty(dataType) )
    { 
        compoundedObject[dataType] += val;
    }
    else
    {
        compoundedObject[dataType] = val;
    }

});

你最终会得到一个对象,而不是一个数组。

答案 2 :(得分:0)

var add=function (a,b){ a=a||0; b=b||0; return a+b};
var input=[ {growth:30},{growth:40},{other:20} ],output=[],temp={};


$.each(input,function(i,o){
  var n;
  for(i in o)
     {n=i;break}
  temp[n]=add(temp[n],o[n]);
});

$.each(temp,function(i,o){
  var k={};
   k[i]=o;
  output.push(k)
});

在输出变量处查找输出。

不要发布很多具体的问题,这可能对其他人没有帮助。

答案 3 :(得分:0)

这很有效。它是纯粹的javascript。

var totals = {};

for (var i = 0; i < compoundedArray.length; i++) {
    var item = compoundedArray[i];
    for (var key in item) {
        totals[key] = (totals[key] || 0) + item[key]
    }
};

答案 4 :(得分:0)

您可以执行以下操作:

var totals = [], tmp = {};
for (var i = 0; i < compoundedArray.length; i++) {
    var obj = compoundedArray[i];
    for (var j in obj) {
        tmp[j] = tmp[j] || 0;
        tmp[j] += obj[j];
    }
}

for(var k in tmp) {
    var obj = {};
    obj[k] = tmp[k];
    totals.push(obj);
}

<强> See this working demo