json兄弟数据

时间:2012-10-22 17:09:27

标签: javascript jquery ajax json

(如果我使用稍微不正确的语言,请原谅我 - 随意根据需要建设性地纠正)

有几篇关于从返回对象中的兄弟姐妹的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"
    }

  ]

}}

4 个答案:

答案 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);
    }   
}

DEMO: http://jsfiddle.net/HtrLu/1/

答案 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/