【问题标题】:jquery each iterating over complex JSON structure with "where clause"jquery 每个使用“where 子句”迭代复杂的 JSON 结构
【发布时间】:2014-04-10 07:49:57
【问题描述】:

我不是 100% 清楚如何制定 $.each() 函数。

以下 JSON 数据块包含数组 ItemValues 中的多个项目。我正在寻找的是一种方法(因为这个数据包可以任意大)有点让每个 ItemValue 数组项 WHERE Fields.Id 相当于某个值“x”。

还有,有没有办法将ItemValues[n].Fields.units 检索为数组?

JSON:

{
   "CacheName":"Default",
       "LastUpdateTime":"\/Date(1396994130568)\/",
       "Type":"Start",
       "TotalItemsCount":3,
       "PassingFilterCount":3,
       "ItemValues":[
      {
         "Fields":{
            "id":"13288263",
            "status":"8",
            "x_cord":"7250600",
            "y_cord":"566620200",
            "code":"1021",
            "sub_code":"1W",
            "priority":"1",
            "units":"1011, 1130, 1201, 1233, 1445, 1501, 1518, 1714, 1726, 1823, 1825, 1832, 3662",
            "ts":"20140402234025UT"
         },
         "Id":"13288263",
         "LastAction":"add"
      },
      {
         "Fields":{
            "id":"13288264",
            "status":"8",
            "x_cord":"",
            "y_cord":"",
            "code":"",
            "sub_code":"",
            "priority":"-1",
            "units":"",
            "ts":""
         },
         "Id":"13288264",
         "LastAction":"add"
      },
      {
         "Fields":{
            "id":"13288265",
            "status":"8",
            "x_cord":"",
            "y_cord":"",
            "code":"",
            "sub_code":"",
            "priority":"-1",
            "units":"",
            "ts":""
         },
         "Id":"13288265",
         "LastAction":"add"
      }
    ]
}

【问题讨论】:

  • 您可能想看看stackoverflow.com/questions/11922383/… 以了解如何处理嵌套数据结构。然后你可以切换到$.each,如果你愿意。
  • @FelixKling 感谢 Felix,我知道如何以这种方式遍历数据,我特意寻找 $.each 方式,因为我不想在结构检查中循环多次对于特定的字段等价。
  • $.each 只是 forfor...in 循环的替代品。它不会做任何循环不能做的事情。例如。 $.each(d, function(k, v) {})for (var k = 0; k < d.length; k++) { var v = d[k]; }for (var k in d) { var v = d[k]; } 相同。如果你知道如何在没有$.each 的情况下做到这一点,你就会知道如何在没有$.each 的情况下做到这一点。
  • 使用 linqjs 赢得比赛...linqjs.codeplex.com
  • @FelixKling 我不知道你在那条评论中说了什么,但我重新读了一遍,我脑子里突然出现了一些东西,现在一切都更清楚了。有时候,我想踢自己。如果我在第一次回复中显得忘恩负义,谢谢和抱歉!

标签: javascript jquery json each


【解决方案1】:

这是一个显示所有内容的代码(根据需要使用 $.each()),使用 JSON.parse()String.split()

var json_string = "Your JSON here";

//Use JSON.parse to make it an object
var json_object = JSON.parse(json_string.innerHTML);

//Will store the matched identifier
var matched_id;

//Will store the matched array
var matched_array;

//A valid test case, with units not null
var x = 13288263; 
$.each(json_object.ItemValues, function(key, item_value){
    if(item_value.Fields.id == x){
        matched_id = item_value.Fields.id;

        //Second part of the question
        var units = item_value.Fields.units;
        if(units != ""){
            //String.split() returns an array, by splitting the string with 
            //selected string
            matched_array = units.split(', ');
        }
    }
});

Here's a demo,来玩吧。

注意:肯定有一些更好的解决方案。

【讨论】:

    【解决方案2】:

    假设您显示的 json 在变量 json 中,那么对于这个确切的场景,您可以使用:

    function validItems(id,json){
     var validItemValues = [];
     var values = json.ItemValues;
     for(var value in values){
      if( !values.hasOwnProperty(value) )continue;
      var itemValue = values[value];
      if( itemValue.Fields.id == id ){
       validItemValues.push(itemValue);
      }
     }
     return validItemValues;
    }
    

    同样的方法使用 jQuery 的 .each:

    function validItems(id,json){
     var validItemValues = [];
     $.each(json.ItemValues,function(){
      if(this.Fields.id == id)validItemValues.push(this);
     });
     return validItemValues;
    }
    

    有关查找 json 值的递归方法,请参阅此答案:https://stackoverflow.com/a/11657379/1026459

    一旦你有了有效的项目,你就可以遍历它们,然后使用 split 将单位字符串转换为数组。

    var validItemList = validItems(id,json);
    for( var item in validItemList ){
     if( !validItemList .hasOwnProperty(item ) )continue;
     var currentItem = validItemList[item];
     var fieldsUnitArray = currentItem.Fields.units.split(" ");
     //work with array of units
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 2010-11-06
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多