2016-12-12 11 views
-1

У меня есть формат JSON с этим форматом:Эквивалент «SELECT SUM (х)» запрос на JSON в JavaScript,

var myJSON = 
{ 
    [ 
    {"project":"4","value":"5"}, 
    {"project":"2","value":"3"}, 
    {"project":"4","value":"5"}, 
    {"project":"4","value":"4"}, 
    {"project":"1","value":"8"}, 
    ] 
} 

Я хотел бы сделать запрос как SELECT SUM(value) WHERE Project = 4. Как я могу сделать такой запрос в Javascript? Я проверил с JSON Path, и я не мог найти способ сделать такой запрос.

+0

https://www.google.com/search?q=sum%20values%20with%20key%20json дает это, например: http://stackoverflow.com/questions/21314533/sum-values-in-json -response-with-jquery – mplungjan

ответ

1

Ваши данные JSON не выглядит правильно. Возможно, вам необходимо изменить его, как

var myJSON = 
{ 
    data: [ 
    {"project":"4","value":"5"}, 
    {"project":"2","value":"3"}, 
    {"project":"4","value":"5"}, 
    {"project":"4","value":"4"}, 
    {"project":"1","value":"8"}, 
    ] 
} 

И тогда сумма будет выглядеть следующим образом:

var myJSON = 
{ 
    data: [ 
    {"project":"4","value":"5"}, 
    {"project":"2","value":"3"}, 
    {"project":"4","value":"5"}, 
    {"project":"4","value":"4"}, 
    {"project":"1","value":"8"}, 
    ] 
} 

var sum = 0; 
for(var i = 0; i< myJSON.data.length; i++) { 
    var project = myJSON.data[i]; 
    if (project.project === "4"){ 
    sum += parseInt(project.value, 10); 
    } 
} 
1

Простой для с условием выполнения работы:

var sum = 0; 
for(var i in myJSON) { 
    if(myJSON[i].project == 4) 
     sum += parseInt(myJSON[i].value); 
} 
1

Это не является допустимым JSON, правильно его первым. Если у вас есть JSON как это:

var myJSON = 
{ 
    "data":[ 
    {"project":"4","value":"5"}, 
    {"project":"2","value":"3"}, 
    {"project":"4","value":"5"}, 
    {"project":"4","value":"4"}, 
    {"project":"1","value":"8"} 
    ] 
} 

Затем Используйте эту функцию, чтобы получить сумму:

getSum(key){ 
    let sum = 0; 
    myJSON.data.forEach(i=>{ 
     if(i.project == key){ 
      sum+= parseFloat(i.value); 
     } 
    }) 
    return sum; 
} 
+0

Это не действительный JSON :-) Поместите данные в двойные кавычки и удалите последнюю запятую ... –

+0

Nice :), теперь это правильно. –

1

var JSON = { 
 
    data: [ 
 
    {"project":"4","value":"5"}, 
 
    {"project":"2","value":"3"}, 
 
    {"project":"4","value":"5"}, 
 
    {"project":"4","value":"4"}, 
 
    {"project":"1","value":"8"}, 
 
    ] 
 
} 
 

 
var sum = 0; 
 
JSON.data.forEach(function(val){ 
 
    sum += val.project==="4"? 
 
      parseInt(val.value, 10): 0; 
 
}); 
 
    
 
console.log(sum);

0
var sum = jsonPath(myjsonobj, "$.data[?(@.project=='4')].value").reduce(function(pv, cv){ 
    return parseInt(cv) + parseInt(pv); 
}); 

Некоторые объяснения:

$.data[?(@.project=='4')].value - дает массив с только значениями, где project == "4"

- выполняет функцию для всех элементов массива (см ECMAScript док)

pv, cv - предыдущее и текущее значение вызова функции для элементов массива. Предыдущее значение (в этом решении) суммой до сих пор, текущее значение является текущим элементом массива (как строка, как и в ваших данных). Таким образом, для каждого элемента массива его целочисленное значение добавляется к «предыдущему» значению и, в конце, возвращается reduce().