【问题标题】:JSON to javaScript arrayJSON 到 JavaScript 数组
【发布时间】:2011-07-29 12:06:37
【问题描述】:

我在处理 JavaScript 中的 JSON 数据时遇到问题,特别是在将数据用作数组以及访问和迭代单个值方面。 JSON文件的结构如下:

{
  "head": {
    "vars": [ "place" , "lat" , "long" , "page" ]
  } ,
  "results": {
    "bindings": [
      {
        "place": { "type": "literal" , "value": "Building A" } ,
        "lat": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "10.3456" } ,
        "long": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "-1.2345" } ,
        "page": { "type": "uri" , "value": "http://www.example.com/a.html" }
      } ,
      {
        "place": { "type": "literal" , "value": "Building B" } ,
        "lat": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "11.3456" } ,
        "long": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "-2.2345" } ,
        "page": { "type": "uri" , "value": "http://www.example.com/b.html" }
      } ,
      {
        "place": { "type": "literal" , "value": "Building C" } ,
        "lat": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "12.3456" } ,
        "long": { "datatype": "http://www.w3.org/2001/XMLSchema#float" , "type": "typed-literal" , "value": "-3.2345" } ,
        "page": { "type": "uri" , "value": "http://www.example.com/c.html" }
      }
    ]
  }
}

我希望能够将其转换为 JavaScript 数组,如下所示,以便我可以遍历它并按顺序提取每个位置的值:

var locations = [
        ['Building A',10.3456,-1.2345,'http://www.example.com/a.html'],
        ['Building B',11.3456,-2.2345,'http://www.example.com/b.html'],
        ['Building C',12.3456,-3.2345,'http://www.example.com/c.html']
];

有人对如何实现这一目标有任何建议吗?我尝试了以下方法,但它在 JSON 中获取“类型”,而不仅仅是值:

$.each(JSONObject.results.bindings, function(i, object) {
    $.each(object, function(property, object) {
        $.each(object, function(property, value) {
              value;
        });
    });
});

任何帮助、建议、意见或更正将不胜感激。

【问题讨论】:

    标签: javascript json


    【解决方案1】:
    var locations = [];
    $.each(JSONObject.results.bindings, function(i, obj) {
        locations.push([obj.place.value, obj.lat.value, obj.long.value, obj.page.value]);
    });
    

    遍历bindings,将每个元素的place.valuelat.valuelong.valuepage.value属性放入一个数组中,然后将该数组添加到locations中。

    您当前的代码使用了两次object,以及property,从而覆盖了这些变量。您应该在嵌套循环中使用唯一的变量名以便能够区分它们。

    【讨论】:

      【解决方案2】:

      对于与公认答案非常相似的纯 Javascript(我喜欢)

      当我有一个定义的长度时,我喜欢使用负的 while 循环来提高速度(而不是传统的 for 循环)。这也可能比 jQuery 答案更快。

      var i = JSONObject.results.bindings.length;
      var locations = [];
      while (i--) {
          t = JSONObject.results.bindings[i];
          locations.push([t.place.value, t.lat.value, t.long.value, t.page.value]);
      };
      //now show the places
      var c = locations.length;
      while (c--) {
          alert(locations[c][0]);
      };
      

      这里有一个小提琴来演示:http://jsfiddle.net/MarkSchultheiss/JH7LR/

      编辑:更新了示例小提琴以将内容粘贴在 div 中。 (使用了一个不属于 OP 问题的小 jQuery,因此它是“添加的材料”,假设您在某处有一个 <div id='holdem'></div>

      $(locations).each(function(i) {
          $('#holdem').prepend("<div>" + $(this)[0] + " Is at:" + this + "</div>");
      });
      

      为了好玩,我更新了小提琴以将建筑物名称显示为建筑物页面的链接: http://jsfiddle.net/MarkSchultheiss/JH7LR/3/

      【讨论】:

        【解决方案3】:
        loc=json.results.bindings;
        tempar1=[];
        tempar2=[];
        
        for (i=0;i<loc.length;i++) {     
            for (prop in loc[i]) {
                temp=loc[i][prop].value;
                tempar1.push(temp);
            }
            tempar2.push(tempar1);
            tempar1=[];
        }
        

        其中 json 等于 Json 对象

        【讨论】:

          【解决方案4】:

          你可以这样做

          for (i=0;i<JSONObject.results.bindings.length;i++)
          
          {newObject = JSONObject.results.bindings;
          somethingelse = newObject[i].place.type;
          
          }
          

          【讨论】:

            【解决方案5】:

            你不需要 jQuery。

            var locations = [];
            JSONObject.results.bindings.forEach(function(binding) {
                locations.push([
                    binding.place.value,
                    binding.lat.value,
                    binding.long.value,
                    binding.page.value
                ]);
            });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-03-07
              • 1970-01-01
              • 2023-01-14
              • 2011-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多