Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript json同级数据_Javascript_Jquery_Ajax_Json - Fatal编程技术网

Javascript json同级数据

Javascript json同级数据,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,如果我使用的语言有点不正确,请原谅我-请根据需要进行建设性的更正 有几篇文章是关于从返回对象中兄弟的JSON数据获取数据的,但我在将这些信息应用到我的情况时遇到了问题: 我有一堆对象,这些对象从REST调用中以JSON的形式返回,对于每个具有某个key:value节点的对象,我需要提取特定key的同级节点的数值。例如: 对于下面的对象列表,我需要将每个具有匹配desc的对象的file_size中的数字相加,并将其返回到页面上匹配的输入值 {"ResultSet":{ Result":[

如果我使用的语言有点不正确,请原谅我-请根据需要进行建设性的更正

有几篇文章是关于从返回对象中兄弟的JSON数据获取数据的,但我在将这些信息应用到我的情况时遇到了问题:

我有一堆对象,这些对象从REST调用中以JSON的形式返回,对于每个具有某个key:value节点的对象,我需要提取特定key的同级节点的数值。例如:

对于下面的对象列表,我需要将每个具有匹配desc的对象的file_size中的数字相加,并将其返回到页面上匹配的输入值

{"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"
    }

  ]

}}

这是一个嵌入在对象中的数组,所以

data.ResultSet.Result[2].file_size

将给您778174

一次迭代,如下所示

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

演示:

您可以使用以下功能:

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);
}
显示包含所有description1文件大小总和的警报

这里有一个正在工作的JSFIDLE:

为了响应您的更新和评论,下面是一些新代码,它创建了一些div,其中包含所有描述的总和。我取出了hasOwnProperty代码,因为您更改了数据集,但是请注意,如果数据数组中的对象没有file_size属性,则必须使用hasOwnProperty来检查它。您应该能够针对jQuery对其进行调整

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

一个有效的JSFIDLE在这里:。

你只需在数组上循环,找到你想要的,然后加起来。我需要写出每个desc的每个总数的结果,在“真实”数据中至少有10个不同的desc值。比如:如果desc与description1匹配,则将所有值相加并存储在隐藏的输入字段中,如果desc与description2匹配,则执行相同的操作。听起来我必须循环查找每个desc值,而desc值本身会因服务器而异,这意味着要查找这些值,将它们存储在一个新数组中,然后检查数组中的每个项是否有desc值。返回的每个数据集在数组中可能有数百个项,可能有几十个数据集要从中返回,因此,我不必对每个desc值进行循环。我能否将每个desc值的值存储在一个数组中,然后将它们相加?如何为每个desc创建单独的数组并告诉javascript只放入匹配项?如果result[I].desc的和[result[I].desc]+=parseIntresult[I][file_size];else sum[result[i].desc]=parseIntresult[i][file_size];全在一个循环中。啊。。。这很有帮助。如果我已经“在”ResultSet.Result中,有没有办法做到这一点?只要使用‘this’?在代码中使用‘hasOwnProperty’我已经可以做到了!谢谢所以“hasOwnProperty”告诉我该属性是否存在,我知道它会出现在我获取的JSON中——那么我如何获取/匹配该特定属性的值呢?@mflorida你所说的匹配是什么意思。。只需使用[]或。在物体上。。比如data['file_size']或data.file_size这是一个人的结束。我如何在jQuery$中调用它。循环时,我已经使用的每个函数来做其他事情?我将如何返回结果以用于为每个desc类型创建唯一的DOM元素?这一个有效。你能解释一下代码吗:data[currentDesc]=typeof data[currentDesc]==undefined?currentSize:data[currentDesc]+currentSize;为了我自己的理解,我只想知道发生了什么。数据[currentDesc]=数据类型[currentDesc]==未定义?currentSize:data[currentDesc]+currentSize;这是if/else的简写吗?还有一个问题。我已经更新了代码以在原始数组中包含另一项-如何显示每个“desc”的每个“格式”的总数,例如:description1:444MB 222MB JPEG,222MB GIF?@mflorida:我正在使用,正如您所建议的,它类似于if/else语句。当你说你有另一个问题,这是一个完美的例子,当它是一个好主意,创造另一个全新的问题,正如我前面提到的。通过这种方式,你可以从许多不同的人那里得到帮助,而不仅仅是一个人。
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);
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);
    }
}