【问题标题】:Looping through each item from JSON to display plane information从 JSON 中循环遍历每个项目以显示平面信息
【发布时间】:2017-02-06 23:47:31
【问题描述】:

问题

我如何设置这些飞机的工作示例。


背景

我的第一部分正在工作,所以我的循环似乎关闭了?我至少可以拉飞机的数量。但是显示所有平面时出现问题。

这是我的Demo on CodePen

我正在查看来自https://developers.wargaming.net/reference/all/wowp/encyclopedia/planes/?application_id=demo&r_realm=eu 的文档

但他们没有一个功能齐全的例子。我想显示飞机的名称,国家,并显示大图。我可以稍后设置它的样式,但需要一个工作示例来帮助我理解和开始。


代码

API

我正在从https://api.worldofwarplanes.eu/wowp/encyclopedia/planes/?application_id=demo 提取数据

JSON 输出

HTML

<p>There are a total of <span id="planeQuantity"></span> planes in the database.</p>
<ul id="planes"></ul>

jQuery 来自

https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js

Javascript

var queryURL = "https://api.worldofwarplanes.eu/wowp/encyclopedia/planes/?application_id=demo";

$.getJSON(queryURL, function (data) {

  var quantity = data.meta.count;

  $('#planeQuantity').append( quantity );

  var name = data.id.name_i8n;
  var nation = data.id.nation;
  var lrgImg = data.id.images.large;

  $(data).each(function(){
    console.log($(this).id);
    $('#planes').append('<li>' + name + 'is from ' + nation + '<img src="' + lrgImg + '">' + '</li>');
  });

})

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    我稍微调整了您的代码。一些cmets:

    1. 你的data.data 是一个对象。所以,你可以为每个键迭代使用for (key in object)(你也可以使用jQuery的each,但这是一个纯JS的方法);

    2. name_i8n 实际上是name_i18n

    3. 将所有var = namevar = nationvar = lrgImg 放入循环内。

    最终代码:

    var queryURL = "https://api.worldofwarplanes.eu/wowp/encyclopedia/planes/?application_id=demo";
    
    $.getJSON(queryURL, function (data) {
    
      var quantity = data.meta.count;
    
      $('#planeQuantity').append( quantity );
    
      for (key in data.data) {
    
        var item = data.data[key];
    
        var name = item.name_i18n;
        var nation = item.nation;
        var lrgImg = item.images.large;    
    
        $('#planes').append('<li>' + name + 'is from ' + nation + '<img src="' + lrgImg + '">' + '</li>');
    
      }
    })
    

    工作笔:http://codepen.io/mrlew/pen/vgaexb


    修改了一些解释

    您收到了一个 data 对象,该对象有一个 data 键,其值是具有这种结构的巨大对象(或多或少):

    {
        "7290": { /* ... */ },
        "7291": {
            "name_i18n": "North American FJ-1 Fury",
            "nation":"usa",
            "images":{
                "large":"http://worldofwarplanes....png",
                /* ... */
            },
            /* ... */
        },
        "7292": { /* ... */ }
    
    }
    

    因此,要遍历 data.data 键的所有键,我们可以使用 for (key in data.data) { }

    在每次迭代中,key 变量将被分配给对象key729072917292。所以,要访问它的值,我们使用data.data[key](例如data.data["7291"]),并为变量item赋值。

    使用像这样的括号是 JavaScript 从对象中检索值的一种方法。另一种方法是使用 点表示法(但您不能将点表示法与数字键一起使用)。

    这是有效的:

    data["data"]["7291"]
    

    这是无效的:

    data.data.7291
    

    【讨论】:

    • @JGallardo 我编辑了更多解释!希望对你有帮助
    • 这是一个非常有用的例子。非常感谢,我知道更好地理解这些概念。
    【解决方案2】:

    您应该在each 中设置namenationlrgImg 的值。所以你附加的元素不会都有相同的东西。并且您应该遍历 data 对象 (data.data) 中的 data 对象。像这样:

    var queryURL = "https://api.worldofwarplanes.eu/wowp/encyclopedia/planes/?application_id=demo";
    
    $.getJSON(queryURL, function (data) {
    
      var quantity = data.meta.count;
    
      $('#planeQuantity').append( quantity );
    
      $.each(data.data, function(key, value){
        var name = value.name_i18n; // get the name of this data entry
        var nation = value.nation; // get the nation of this data entry
        var lrgImg = value.images.large; // ...
    
        $('#planes').append('<li>' + name + 'is from ' + nation + '<img src="' + lrgImg + '">' + '</li>');
      });
    });
    

    【讨论】:

    • 这不起作用,但也许我做错了什么。这是我尝试过的代码笔codepen.io/JGallardo/pen/rjrGWw
    • 虽然有错误:/ "undefinedis" 这里是更新后的 codepen 与您的代码。你在测试吗? codepen.io/JGallardo/pen/apjLKK
    • @JGallardo name_i8n 应该是 namei18n。更新了!
    • @JGallardo 是的,我知道!
    • @ibrahimmahrir 不知道我们可以使用 jQuery .each 来遍历对象键。一直在学习 +1
    【解决方案3】:
    var queryURL = "https://api.worldofwarplanes.eu/wowp/encyclopedia/planes/? application_id=demo";
    
    $.getJSON(queryURL, function (data) {
        var quantity = data.meta.count;
        $('#planeQuantity').append( quantity );
    
       $.each(data.data, function(i, e) {
           var name = e.name_i18n;
           var nation = e.nation;
           var lrgImg = e.images.large;
    
           $('#planes').append('<li>' + name + 'is from ' + nation + '<img src="' + lrgImg + '">' + '</li>');
       });
    });
    

    【讨论】:

    • 这个好像不行,有demo吗?你能向我解释一下我问的, function(i, e),因为有人做的不同
    【解决方案4】:

    您需要遍历data.data 对象。由于您不使用 dom 节点,请使用 $.each() 而不是 $.fn.each()

    $.each(data.data, function(key, obj){
    
       console.log(key) // "4101"
       console.log(obj.name) // "type=91"
    })
    

    【讨论】:

    • 我很困惑如何添加它。您的答案没有显示任何 HTML
    • 我正在向您展示如何获取 name ... 不难从那里转到您的 html,这将在此循环中使用相同的方法
    • 如果传入的参数是对象,我认为jQuery会自动切换到$.fn
    • @charlietfl 我感谢您的意见,但评论“这并不难”并没有帮助。
    • 只需在循环中添加您的 html 行 ..并将其中的变量修改为 obj.nameobj.images.small 之类的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多