Итерация по объекту для добавления всех подходящих свойств

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 и складывать все проценты с одинаковым идентификатором, поэтому я получаю что-то вроде:

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}

Теги:
object
arrays
comparison

2 ответа

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 при создании массива начальных результатов, но это не сработало. Вот как я реализовал: jsfiddle.net/HXwt7/1
  • 0
    @ Бэтмен Это бы не объяснило - вы получите строки, а не NaN . Есть ли вероятность, что некоторые percent поля отсутствуют?
Показать ещё 10 комментариев
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 везде, где есть проценты, но это не работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню