Как перебрать структуру JSON?

У меня следующая структура JSON:

[{ "id":"10", "class": "child-of-9" }, { "id": "11", "classd": "child-of-10" }]

Как мне перебрать его с помощью JavaScript?


person Flueras Bogdan    schedule 03.07.2009    source источник
comment
stackoverflow .com / questions / 1050674 /.   -  person Max    schedule 03.07.2009
comment
jquery или javascript? jquery написан на javascript!   -  person AlikElzin-kilaka    schedule 28.08.2014
comment
Это должен быть jQuery или чистый JavaScript.   -  person Rasshu    schedule 17.09.2015
comment
Как мне перебрать структуру JSON? Нет. Вы разбираете его, после чего у вас больше нет JSON, и вы зацикливаетесь через получившийся массив.   -  person T.J. Crowder    schedule 09.05.2017
comment
Создан итератор IIFE github.com/eltomjan/ETEhomeTools/BlobTM_Hmaster/ / он имеет предопределенные (базовые) DepthFirst и BreadthFirst next и возможность перемещаться внутри структуры JSON без рекурсии.   -  person Tom    schedule 09.07.2019
comment
Я думаю, что этот вопрос был переписан, чтобы не упоминать jQuery, но, согласно другим комментариям, в исходном вопросе упоминался jQuery. Это сбивает с толку, потому что в принятом ответе действительно используется jQuery, поэтому он не применим, скажем, к ситуации с node.js.   -  person paulkernfeld    schedule 17.01.2021


Ответы (13)


Взято из документации jQuery:

var arr = [ "one", "two", "three", "four", "five" ];
var obj = { one:1, two:2, three:3, four:4, five:5 };

jQuery.each(arr, function() {
  $("#" + this).text("My id is " + this + ".");
  return (this != "four"); // will stop running to skip "five"
});

jQuery.each(obj, function(i, val) {
  $("#" + i).append(document.createTextNode(" - " + val));
});
person Marquis Wang    schedule 03.07.2009
comment
Это очень запутанный синтаксис. Не могли бы вы объяснить это? Можете ли вы также предоставить результат? - person AlikElzin-kilaka; 23.06.2011
comment
Ответ должен был быть дан на JavaScript, а не на JQuery. - person Wayne Hartman; 31.05.2013
comment
@WayneHartman Я сочувствую вашей точке зрения, но исходный вопрос действительно говорит о jquery или javascript. Похоже, ошибка заключалась в отсутствии тега jquery в вопросе. - person vlasits; 13.01.2014
comment
Точно так же lodash предлагает _.forEach (псевдоним _. each для совместимости с подчеркиванием), чтобы добиться того же. - person Ville; 25.10.2014
comment
OP запросил либо jQuery, либо JavaScript, поэтому ответ подходит для моей книги. - person Kirby L. Wallace; 03.07.2017
comment
Это сбивает с толку, потому что в какой-то момент кажется, что вопрос был переписан, чтобы больше не упоминать jQuery ????‍♂️ - person paulkernfeld; 17.01.2021

var arr = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "class": "child-of-10"}];
    
for (var i = 0; i < arr.length; i++){
  document.write("<br><br>array index: " + i);
  var obj = arr[i];
  for (var key in obj){
    var value = obj[key];
    document.write("<br> - " + key + ": " + value);
  }
}

Примечание: метод for-in отлично подходит для простых объектов. Не очень умно использовать с объектом DOM.

person Your Friend Ken    schedule 11.07.2009
comment
Не забудьте проверить прямо внутри вашего for key in obj цикла, что obj.hasOwnProperty(key) --- иначе однажды вы можете найти другие ключи, пробивающиеся в obj, которые вам не нужны, если, например, кто-то расширит прототип ... - person Funka; 17.01.2014
comment
Привет, могу я просто спросить, хочу ли я использовать это для получения удаленного массива json, как мне это сделать? пожалуйста, дайте мне совет! - person Hanzawa Naoki; 22.08.2014
comment
@AlexanderSupertramp задается с использованием буквального обозначения массива с объектами в буквальном обозначении объекта. В JavaScript массивы, по сути, также являются объектами. Поэтому я бы по-прежнему ссылался на arr, установленный с использованием JSON. - person Your Friend Ken; 19.11.2014
comment
@devios Итак, что было бы разумным решением с объектом DOM? - person musicformellons; 23.11.2015
comment
@musicformellons См. developer.mozilla.org/ en / docs / Web / JavaScript / Reference / для современного подхода (не поддерживается IE). - person devios1; 23.11.2015
comment
Отлично. Не требует дополнительных библиотек. - person bonhoffer; 07.02.2016
comment
Никогда никогда! - используйте цикл for ... для перечисления по массиву. - person Stephan Weinhold; 11.08.2016
comment
Формула for in встречается внутри каждого элемента массива во вложенном объекте, а не для перебора самого массива. - person wunth; 06.05.2018

Используйте для ... из:

var mycars = [{name:'Susita'}, {name:'BMW'}];

for (var car of mycars) 
{
  document.write(car.name + "<br />");
}

Результат:

Susita
BMW
person AlikElzin-kilaka    schedule 05.12.2010
comment
Susita - это переменная, зависящая от культуры, верно? :-) - person GilShalit; 20.12.2010
comment
Правильно, переменная верхнего уровня, как у BMW ;-) - person AlikElzin-kilaka; 13.01.2011
comment
Это обычный массив, а не JSON. - person jonasespelita; 07.10.2011
comment
Разве это не должно быть i.name вместо mycars [i] .name - person Sachin Prasad; 22.10.2014
comment
@SachinPrasad Нет, i - это имя свойства. - person JLRishe; 20.01.2015
comment
Работает как с массивами, так и с jsons. - person AlikElzin-kilaka; 09.06.2015
comment
почему для меня это return undefined? - person Tanya von Degurechaff; 11.08.2016
comment
мой массив имеет такую ​​же структуру. - person Tanya von Degurechaff; 11.08.2016
comment
for ... in не подходит для массивов. - person mplungjan; 13.10.2016
comment
Проблема здесь: mycars[i].name. Насколько я понял, первоначальный вопрос заключается в том, что к имени свойства (в данном случае name) следует обращаться через переменную. - person SsJVasto; 07.04.2017
comment
Я также понимаю, что я не определен Uncaught ReferenceError: i is not defined - person behelit; 17.05.2017
comment
Вы используете for..in, а не foreach. Насколько мне известно, Foreach не существует для объектов JSON. - person mneumann; 30.01.2020
comment
Отлично работает, именно то, что мне нужно для моего Vanilla JS. - person Lance; 02.08.2020

Пожалуйста, дайте мне знать, если это будет непросто:

var jsonObject = {
  name: 'Amit Kumar',
  Age: '27'
};

for (var prop in jsonObject) {
  alert("Key:" + prop);
  alert("Value:" + jsonObject[prop]);
}
person abdulbasit    schedule 30.05.2014
comment
Ваш jsonObject не является настоящим объектом JSON. Это объект javascript. Вот почему это работает. Однако, если у кого-то есть объект JSON, он может преобразовать его в объект JS, а затем использовать ваш метод. Чтобы преобразовать объект JSON в объект JS, используйте jsObject = JSON.parse (jsonObject); - person prageeth; 31.10.2014
comment
Если вы получили свои данные через jQuery.getJSON (), то это прекрасно работает. - person John Mee; 23.04.2015

Если это ваш dataArray:

var dataArray = [{"id":28,"class":"Sweden"}, {"id":56,"class":"USA"}, {"id":89,"class":"England"}];

тогда:

$(jQuery.parseJSON(JSON.stringify(dataArray))).each(function() {  
         var ID = this.id;
         var CLASS = this.class;
});
person Swapnil Godambe    schedule 03.10.2012
comment
Лучший ответ с использованием JQuery. Я кодирую данные из бэкэнда с помощью AJAX, поэтому я не использовал функцию 'stringify'. Код понятен и красив! - person danigonlinea; 18.08.2015

Скопировано и вставлено с http://www.w3schools.com, поэтому накладные расходы JQuery не требуются.

var person = {fname:"John", lname:"Doe", age:25};

var text = "";
var x;
for (x in person) {
    text += person[x];
}

РЕЗУЛЬТАТ: Джон Доу 25

person Gerrit Brink    schedule 09.05.2016

Пример mootools:

var ret = JSON.decode(jsonstr);

ret.each(function(item){
    alert(item.id+'_'+item.classd);
});
person Jason    schedule 03.07.2009

С вложенными объектами его можно получить как рекурсивную функцию:

function inside(events)
  {
    for (i in events) {
      if (typeof events[i] === 'object')
        inside(events[i]);
      else
      alert(events[i]);
    }
  }
  inside(events);

где as events - это объект json.

person Fatima Zohra    schedule 22.03.2013
comment
Здорово. Просто чтобы об этом упомянули; если вы прочитаете переменную (i), вы можете получить имена свойств (сколько это стоит) - person netfed; 02.07.2013

Вы можете использовать мини-библиотеку, например objx - http://objx.googlecode.com/

Вы можете написать такой код:

var data =  [ {"id":"10", "class": "child-of-9"},
              {"id":"11", "class": "child-of-10"}];

// alert all IDs
objx(data).each(function(item) { alert(item.id) });

// get all IDs into a new array
var ids = objx(data).collect("id").obj();

// group by class
var grouped = objx(data).group(function(item){ return item.class; }).obj()

Доступны и другие «плагины», позволяющие обрабатывать подобные данные, см. http://code.google.com/p/objx-plugins/wiki/PluginLibrary

person Mat Ryer    schedule 03.07.2009

Маркиз Ван может быть лучшим ответом при использовании jQuery.

Вот нечто очень похожее на чистый JavaScript, использующий метод JavaScript forEach. forEach выполняет функцию аргумент. Затем эта функция будет вызываться для каждого элемента в массиве с указанным элементом в качестве аргумента.

Коротко и легко:

var results = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "classd": "child-of-10"} ];

results.forEach(function(item) {
    console.log(item);
});

person Fabien Snauwaert    schedule 06.05.2014

это чисто комментированный пример JavaScript.

  <script language="JavaScript" type="text/javascript">
  function iterate_json(){
            // Create our XMLHttpRequest object
            var hr = new XMLHttpRequest();
            // Create some variables we need to send to our PHP file
            hr.open("GET", "json-note.php", true);//this is your php file containing json

            hr.setRequestHeader("Content-type", "application/json", true);
            // Access the onreadystatechange event for the XMLHttpRequest object
            hr.onreadystatechange = function() {
                if(hr.readyState == 4 && hr.status == 200) {
                    var data = JSON.parse(hr.responseText);
                    var results = document.getElementById("myDiv");//myDiv is the div id
                    for (var obj in data){
                    results.innerHTML += data[obj].id+ "is"+data[obj].class + "<br/>";
                    }
                }
            }

            hr.send(null); 
        }
</script>
<script language="JavaScript" type="text/javascript">iterate_json();</script>// call function here
person karto    schedule 21.01.2014

Еще одно решение для навигации по документам JSON - JSONiq (реализовано в Zorba), где можно написать что-то вроде:

jsoniq version "1.0";

let $doc := [
  {"id":"10", "class": "child-of-9"},
  {"id":"11", "class": "child-of-10"}
]
for $entry in members($doc)             (: binds $entry to each object in turn :)
return $entry.class                     (: gets the value associated with "class" :)

Вы можете запустить его на http://try.zorba.io/

person Ghislain Fourny    schedule 23.08.2012

person    schedule
comment
Вы должны объяснить свой код. Ответ без пояснений мало помогает. - person Reeno; 22.11.2015