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