2014-03-21 22 views
0

У меня есть запрос 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}] 

Как я мог перебирать result и сложить все проценты с тем же 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}

ответ

1

Попробуйте это:

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++; 
}); 

Это создает объект с идентификаторами в виде ключей. Если вы хотите, чтобы преобразовать его в массив:

total = Object.keys(percentages).map(function (it) { 
    return percentages[it] 
}); 

Чтобы получить среднее значение в процентах, вы можете сделать это:

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

Я думаю, что он работает по назначению, но каждый процент возвращается как NaN. Объект результатов сохраняет проценты как строку, я думаю. Я пробовал parseFloat при создании исходного массива результатов, но это не сработало. Вот как я реализовал: http://jsfiddle.net/HXwt7/1/ – Batman

+0

@Batman Это не объяснит это - вы получите строки, а не 'NaN'. Есть ли какие-то поля 'percent'? – sabof

+0

Я так не думаю. Я записал результат, и они не пропали без вести. – Batman

0

Просто сделайте новый объект и перебирать, хотя и старый. Вы можете увидеть демо-версию здесь: http://jsfiddle.net/TSyE5/2/

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}); 
}); 
+0

Да, я получаю ту же ошибку, что и вышеупомянутый ответ. Процент возвращается как NaN. Я пытался бросить в parseFloat, где когда-либо есть процент, но это не работает. – Batman

Смежные вопросы