(如果我使用稍微不正确的语言,请原谅我 - 随意根据需要建设性地纠正)
有几篇关于从返回对象中的兄弟姐妹的JSON数据中获取数据的帖子,但是我在将这些信息应用到我的情况时遇到了麻烦:
我有一堆对象从REST调用返回为JSON,并且每个对象都有一个特定键的节点:value我需要提取特定键的兄弟节点的数值。例如:
对于以下对象列表,我需要在“file_size”中为每个匹配“desc”的对象添加数字,并将其返回到页面上匹配的输入值。
{"ResultSet":{
Result":[
{
"file_size":"722694",
"desc":"description1",
"format":"GIF"
},
{
"file_size":"19754932",
"desc":"description1",
"format":"JPEG"
},
{
"file_size":"778174",
"desc":"description2",
"format":"GIF"
},
{
"file_size":"244569996",
"desc":"description1",
"format":"PNG"
},
{
"file_size":"466918",
"desc":"description2",
"format":"TIFF"
}
]
}}
答案 0 :(得分:0)
这是一个嵌入在对象中的数组,所以
data.ResultSet.Result[2].file_size
会给你778174
答案 1 :(得分:0)
var sum = {}, result = ResultSet.Result
// Initialize Sum Storage
for(var i = 0; i < result.length; i++) {
sum[result[i].desc] = 0;
}
// Sum the matching file size
for(var i = 0; i < result.length; i++) {
sum[result[i].desc] += parseInt(result[i]["file_size"]
}
执行上述代码后,您将拥有一个名为sum
的JSON,如此
sum = {
"description1": 20477629,
"description2": 1246092
};
答案 2 :(得分:0)
下面的迭代可以完成这项工作,
var result = data.ResultSet.Result;
var stat = {};
for (var i = 0; i < result.length; i++) {
if (stat.hasOwnProperty(result[i].cat_desc)) {
if (result[i].hasOwnProperty('file_size')) {
stat[result[i].cat_desc] += parseInt(result[i].file_size, 10);
}
} else {
stat[result[i].cat_desc] = parseInt(result[i].file_size, 10);
}
}
答案 3 :(得分:0)
您可以使用以下功能:
function findSum(description, array) {
var i = 0;
var sum = 0;
for(i = 0; i < array.length; i++) {
if(array[i]["desc"] == description && array[i].hasOwnProperty("file_size")) {
sum += parseInt(array[i]["file_size"], 10);
}
}
alert(sum);
}
并称之为:
findSum("description1", ResultSet.Result);
显示包含所有"description1"
文件大小总和的提醒。
工作的JSFiddle在这里:http://jsfiddle.net/Q9n2U/。
在回复您的更新和评论时,这里有一些新代码可以创建一些带有所有描述摘要的div
。我删除了hasOwnProperty
代码,因为您更改了数据集,但请注意如果数据数组中的对象没有file_size
属性,则必须使用hasOwnProperty
来检查为它。您应该可以非常轻松地为jQuery .each
调整此值。
var data = {};
var array = ResultSet.Result;
var i = 0;
var currentDesc, currentSize;
var sizeDiv;
var sumItem;
//Sum the sizes for each description
for(i = 0; i < array.length; i++) {
currentDesc = array[i]["desc"];
currentSize = parseInt(array[i]["file_size"], 10);
data[currentDesc] =
typeof data[currentDesc] === "undefined"
? currentSize
: data[currentDesc] + currentSize;
}
//Print the summations to divs on the page
for(sumItem in data) {
if(data.hasOwnProperty(sumItem)) {
sizeDiv = document.createElement("div");
sizeDiv.innerHTML = sumItem + ": " + data[sumItem].toString();
document.body.appendChild(sizeDiv);
}
}
工作的JSFiddle在这里:http://jsfiddle.net/DxCLu/。