2015-11-17 4 views
0

Я борюсь, как суммировать все значения «B» в моем объекте json. Я хочу, чтобы консольный журнал показывал мне общую сумму всех значений «B».Как перебрать список объектов json?

var voltot = 0; 

$.each(json,function(k,v){ 

    voltot = v.B += voltot ; 

    //console.log(v.B); 

}); 

console.log(voltot); 

ЗДЕСЬ МОЙ ПОЛНЫЙ ОБЪЕКТ JSON.

var json= 
 
[ 
 
    { 
 
     "a": "OOCBER", 
 
     "b": "OOCL BERLIN", 
 
     "c": "CHINA", 
 
     "d": "GREAT BRITAIN", 
 
     "e": "*PI", 
 
     "f": "NGB", 
 
     "g": "CN", 
 
     "i": "GB", 
 
     "n": 9, 
 
     "o": 6, 
 
     "p": "2015-09-14", 
 
     "q": "2015-09-14", 
 
     "s": 4, 
 
     "u": "40HC", 
 
     "v": "TRLU7564566", 
 
     "w": "CN0794909", 
 
     "x": "LEIGH", 
 
     "y": "NINGBO", 
 
     "z": 395, 
 
     "B": 68.8, 
 
     "C": 7987.5, 
 

 
    }, 
 
    { 
 
     "a": "OOCBER", 
 
     "b": "OOCL BERLIN", 
 
     "c": "CHINA", 
 
     "d": "GREAT BRITAIN", 
 
     "e": "*PI", 
 
     "f": "NGB", 
 
     "g": "CN", 
 
     "i": "GB", 
 
     "n": 9, 
 
     "o": 6, 
 
     "p": "2015-09-14", 
 
     "q": "2015-09-14", 
 
     "s": 4, 
 
     "u": "40HC", 
 
     "v": "TCLU8306124", 
 
     "w": "CN0786008", 
 
     "x": "OXFORDSHIRE", 
 
     "y": "NINGBO", 
 
     "z": 412, 
 
     "B": 68, 
 
     "C": 8790.5, 
 

 
    } 
 
]

я борюсь, как суммировать все значения "B" в моем объекте JSon. Я хочу, чтобы консольный журнал показывал мне общую сумму всех значений «B».

var voltot = 0; 

$.each(json,function(k,v){ 

    voltot = v.B += voltot ; 

    //console.log(v.B); 

}); 

console.log(voltot); 

ответ

0

Предпочтительный способ для получения уникального значения из массива является Array.prototype.reduce метод, который принимает функцию обратного вызова функция и начальное значение (оно уменьшает массив до одного значения). Вы можете использовать его таким образом:

json.reduce(function(total, current) { return typeof current.B === "number" ? total + current.B : total; }, 0); 

Адрес JSFiddle.

+0

говорит NaN на оповещении –

+0

@ user5554551 Возможно, вы используете IE 8? Array.prototype.reduce указывается в ECMA 5.1, поэтому он должен быть реализован во всех современных браузерах, но если вам нужно, то на [MDN] будет определен полиспол (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce # Polyfill) – Aaron

+0

@ user5554551 Я обновил свой ответ (и JSFiddle), чтобы объяснить, что все ваши объекты не имеют поля .B. Это может решить вашу проблему с NaN. Изменить: oops, все они есть. Тогда ваш браузер не соответствует ECMA 5.1. – Aaron

4

Это неправильно

voltot = v.B += voltot ; 

сделать так

voltot += v.B; 

Или

voltot = v.B + voltot ; 
+0

Когда я это делаю, я получаю NaN в консоли. –

+1

@ user5554551 Имеет ли каждый индекс в массиве B? – epascarello

+0

Из любопытства и не по теме: Почему это не работает? «=» и «+ =» имеют одинаковый приоритет и должны выполняться «справа налево». Таким образом, это должно эффективно стать: 'voltot = (v.B + = voltot)', который, на мой взгляд, должен работать так, как ожидалось. – puelo

0

Вот JSFiddle. Я просто сократил json и post. Попробуйте использовать полный набор json

var json= 
[ 
    { 

     "z": 395, 
     "B": 68, 
     "C": 7987.5, 

    }, 
    { 

     "z": 395, 
     "B": 68, 
     "C": 7987.5, 
    } 
]; 

var voltot = 0; 

$.each(json,function(k,v){ 
    voltot += v.B; 
}); 

console.log(voltot); 
+0

Говорит NAN в консоли –

+0

Можете ли вы опубликовать свой полный json? – Amel

+0

См. Выше –

0

Оператор + = неверен. Ответ @RiccardoC был правильным.

Кроме того, вам не нужно использовать jquery для суммирования значений. Вы можете просто сделать следующие функции

var voltot=0; 
json.forEach(function(element) {voltot+=element.B}) 

в цикле, будет работать обратного вызова для каждого элемента вашего массива

+0

И снова .... Говорит NAN в консоли –

+1

'.map()' переводит каждое значение массива в новое. Вместо этого вы должны использовать '.forEach()'. – Andreas

+0

@ Andreas сокращение было бы еще более уместным. – Aaron

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