Как перебрать массив JSON - PullRequest
0 голосов
/ 25 апреля 2018

Я загружаю следующий файл json из URL:

{
    "Airports": [
      {
        "listing": "East 34th Street Heliport",
        "iata": "TSS",
        "type": "heliport",
        "size": "tiny"
      },
      {
        "listing": "Blaine Municipal Airport",
        "iata": "BWS",
        "type": "closed",
        "size": "small"
      },
      {
        "listing": "Toronto City Airport",
        "iata": "YTZ",
        "type": "airport",
        "size": "medium"      
      },
      {
        "listing": "Amsterdam Airport Schiphol",
    "iata": "AMS",
        "type": "airport",
        "size": "large"      
       },
      {
        "listing": "Detroit County Airport",
        "iata": "DTW",
        "type": "airport",
        "size": "large"
      }
    ]
}

И я хочу пройти через массив Аэропорты и отобразить все имена и значения ключей в DOM. Я делаю это в цикле .each (), используя jquery mobile:

    if(pageID == "page1"){
        var pageTitle="Error";
        //temp var to hold collapsible HTML 
        var colItem="";

        $.ajax({
        url:"some_url",
        method:"GET",
        cache:false,
        dataType:"json",
        success:function(data){

            pageTitle = (Object.keys(data)[0]).toUpperCase();


            $(data.Airports).each(function(index,value){                   

                //build all the needed collapsibles
                colItem += 
                        "<div data-role='collapsible'><h2>" 
                        + value.listing + 
                        "</h2> <p>" 
                        + + 
                        "</p> <p>" 
                        + + 
                        "</p> <p>" 
                        + + 
                        "</p></div>";

            });
        }            

    });

Есть ли способ сделать это, не ссылаясь на значения ключей, такие как то, что я сделал, используя value.listing, но вместо этого перебирать его как массив, чтобы получить все значения таким образом.

Я ищу окончательный результат, подобный этому:

 East 34th Street Heliport

iata       TSS
type       heliport
size       tiny

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вот очень простая JSFiddle, как вы можете это сделать:

https://jsfiddle.net/8euuoccf/

var jsonData = {
  "Airports": [{
      "listing": "East 34th Street Heliport",
      "iata": "TSS",
      "type": "heliport",
      "size": "tiny"
    },
    {
      "listing": "Blaine Municipal Airport",
      "iata": "BWS",
      "type": "closed",
      "size": "small"
    },
    {
      "listing": "Toronto City Airport",
      "iata": "YTZ",
      "type": "airport",
      "size": "medium"
    },
    {
      "listing": "Amsterdam Airport Schiphol",
      "iata": "AMS",
      "type": "airport",
      "size": "large"
    },
    {
      "listing": "Detroit County Airport",
      "iata": "DTW",
      "type": "airport",
      "size": "large"
    }
  ]
};

$(document).ready(function() {

    // Iterate over each airport
    jsonData.Airports.forEach(airport => {
      colItem = `<div data-role='collapsible'><h2>${airport.listing}</h2>`;

      // Iterate over each airport key
      Object.keys(airport).forEach(key => {
        colItem += `<p>${key}: ${airport[key]}</p>`;
      });
      colItem += '</div>';

      // Finally, append it to body
      var html = $.parseHTML(colItem);
      $('body').append(colItem);
    });
});

Существует несколько способов перебора ключей / значений объекта. Object.entries() - еще один вариант, но имейте в виду, что он не поддерживается в IE. В этом примере я использовал Object.keys(), а затем я получаю доступ к соответствующему значению. Если вы хотите использовать его в другом формате в DOM (например, в таблице), возьмите key и airport[key] и добавьте их по своему усмотрению.

0 голосов
/ 25 апреля 2018

Вы можете сделать это так.Динамически создайте строку HTML, а затем добавьте ее на главную страницу HTML:

var jsonData = {
    "Airports": [
      {
        "listing": "East 34th Street Heliport",
        "iata": "TSS",
        "type": "heliport",
        "size": "tiny"
      },
      {
        "listing": "Blaine Municipal Airport",
        "iata": "BWS",
        "type": "closed",
        "size": "small"
      },
      {
        "listing": "Toronto City Airport",
        "iata": "YTZ",
        "type": "airport",
        "size": "medium"      
      },
      {
        "listing": "Amsterdam Airport Schiphol",
    "iata": "AMS",
        "type": "airport",
        "size": "large"      
       },
      {
        "listing": "Detroit County Airport",
        "iata": "DTW",
        "type": "airport",
        "size": "large"
      }
    ]
};

var nHTML = '';
jsonData.Airports.forEach(function(airport){
  var paragraph = '';
  paragraph+='<p>iata:   '+airport.iata+'</p>' + 
             '<p>type:   '+airport.type+'</p>' +
             '<p>size:   '+airport.size+'</p>';
  var colItem = '<div data-role="collapsible">' +airport.listing+ '<h2></h2>'+paragraph+'</div>';
  nHTML+=colItem;
});

$('#container').html(nHTML);
#container div{
  margin: 7px;
  background: grey;
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='container'></div>
...