Javascript 遍历对象以添加所有匹配的属性

Javascript 遍历对象以添加所有匹配的属性,javascript,jquery,arrays,object,comparison,Javascript,Jquery,Arrays,Object,Comparison,我有一个caml查询,它将在xml中返回类似的内容 ID Title Percentage 7;#7 2 1.00000000000000 7;#7 3 0.220000000000000 7;#7 sub 1.1 0 7;#7 4 0.140000000000000 12;#12 7 0.670000000000000 13;#13

我有一个caml查询,它将在xml中返回类似的内容

    ID      Title        Percentage
    7;#7    2       1.00000000000000
    7;#7    3       0.220000000000000
    7;#7    sub 1.1     0
    7;#7    4       0.140000000000000
    12;#12  7       0.670000000000000
    13;#13  6       0.700000000000000
我可能会为每个项目创建一系列对象。大概是这样的:

var result = [{id:7,title:"2",percent:1.0},...,{id:13,title:"6",percent:0.7}]
我如何遍历
结果
并将所有具有相同ID的百分比相加,从而得出如下结果:

var total = [{id:7,percent:1.36,count:4},{id:12,percent:0.67,count:1},{id:13,percent:0.7,count:1}] 
或者即使我可以
percent/count=totalPercentage
因此我最终得到的对象只有
{id:7,totalPercentage:0.325}

尝试以下方法:

var percentages = {};

result.forEach(function (it) {
  var obj = percentages[it.id] = percentages[it.id] || {
    percent: 0, 
    count: 0, 
    id: it.id
  };
  obj.percent += Number(it.percent); // Casting to Number, in case percent comes as string
  obj.count++;
});
这将创建一个对象,ID作为键。如果要将其转换为数组,请执行以下操作:

total = Object.keys(percentages).map(function (it) {
  return percentages[it]
});
要获得百分比的平均值,可以执行以下操作:

total = total.map(function(it) {
  return {
    id: it.id, 
    percent: it.percent / it.count
  };
});

只需创建新对象并迭代旧对象即可。您可以在此处看到演示:


我认为这是按计划进行的,但每一个百分比都以NaN的形式返回。results对象将百分比存储为字符串。我在创建初始结果数组时尝试了parseFloat,但没有成功。我是这样实现的:@Batman,这并不能解释它——你得到的是字符串,而不是
NaN
。有没有可能一些
百分比
字段丢失了?我不这么认为。我记录了结果,结果没有遗漏。您的答案是否对百分比/计数之和进行除法?我看不出代码中会出现这种情况。嗨@sabof,这是我正在处理的数据:我使用jquery查找z:row,然后选择我需要的字段,为每个字段创建一个对象,并将该对象推送到数组中。我刚刚取了parentID和百分比。是的,我得到了与上面答案相同的错误。%以NaN的形式返回。我试着在有百分比的地方加入parseFloat,但那不起作用。
var totalPercent = [],
    total = {},
    result = [{id:8,title:"3",percent:1.0},{id:7,title:"2",percent:1.0},{id:7,title:"2",percent:3.0},{id:13,title:"6",percent:0.7},{id:13,title:"6",percent:0.7},{id:13,title:"6",percent:0.7}];
$.each(result, function(){
    !(this.id in total) && (total[this.id] = {id:this.id, title:this.title, percent:0, count:0});
    total[this.id].percent += this.percent;
    total[this.id].count++;
});

$.each(total, function(i){
    total[i].percent = total[i].percent/total[i].count;
    totalPercent.push({id:total[i].id, percent:total[i].percent});
});