Разбор 2-мерного массива JSON в Javascript - PullRequest
3 голосов
/ 21 марта 2010

У меня есть двумерный массив JSON, где каждый элемент содержит несколько атрибутов. Приведенный ниже пример намеренно упрощен:

var map_data = { "1":
                      {"1":{"name":"aa"},"2":{"name":"bb"}},
                 "2":
                      {"1":{"name":"cc"},"2":{"name":"dd"}}
               };

Я пытаюсь проанализировать данные, но .length не работает:

for(x=1; x<=map_data.length; x++) { 
    for(y=1; y<=map_data[x].length; y++) {
        // CODE 
    }
}

Большое, большое спасибо!

Ответы [ 5 ]

7 голосов
/ 21 марта 2010

Это не массив, это простые объекты, поэтому вы не можете использовать свойство length.

Вам необходимо использовать оператор for...in:

for(var x in map_data) { 
  if (map_data.hasOwnProperty(x))
    for(var y in map_data[x]) {
      if (map_data[x].hasOwnProperty(y)) {
        // CODE
      }
    }
}

Проверки hasOwnProperty заключаются в том, что этот оператор перебирает все свойства, унаследованные или нет, и если что-то (например, некоторые JavaScript-структуры) расширяет объекты Array.prototype или Object.prototype, эти расширенные свойства также будут повторяться. 1013 *

Вы должны знать, что это утверждение никоим образом не обеспечивает порядок итерации.

Я бы порекомендовал вам использовать "настоящий" массив:

[
 [{"name":"aa"},{"name":"bb"}],
 [{"name":"cc"},{"name":"dd"}]
]

Таким образом, вы сможете использовать свойство length для итерации по индексам.

2 голосов
/ 21 марта 2010

hasOwnProperty используется для определения того, имеет ли объект указанное свойство как прямое свойство этого объекта безотносительно к его цепочке прототипов.

for(var i in map_data){
    if(map_data.hasOwnProperty(i)){
        for(var j in map_data[i]){
            if(map_data[i].hasOwnProperty(j)){
                /*do whatever you want with map_data[i][j]*/
            }
        }
    }
}
2 голосов
/ 21 марта 2010

Поскольку map_data - это объект вместо массива, вам нужно использовать for / in loop:

for (var x in map_data) {
  // check for hasOwnProperty omitted for simplicity.
  for (var y in map_data[x]) {
    // CODE.
  }
}

Но лучше отправить этот JSON в виде массива [a,b,c] вместо объекта {"0":a,"1":b,"2":c}.

0 голосов
/ 24 декабря 2013

, если это кому-то помогает, это пример c # и javascript:

C #:

List<List<string>>  list_array = new List<List<string>>();

JavaScriptSerializer jss = new JavaScriptSerializer();
string _myJSONstring = jss.Serialize(list_array); 

/ * в этом случае list_array - это двумерный список, но может быть одним массивом, если вы напечатаете _myJSONstring, это будет выглядеть так: "[[" XX "," AAAA "], [" YY "," BBBB "]]" * /

JavaScript:

в функцию, которая получает строку из c #:

var a = JSON.parse(array);
    for (var t = 0; t < array.length; t++) {
        for (v = 0; v < array[t].length; v++) {
            alert(array[t][v]);
        }
    }
0 голосов
/ 21 марта 2010

Используйте конструкцию for .. in:

for (var m in map_data) {
     // ...
}

Кроме того, я должен отметить, что это не «массив JSON», а скорее вложенный объект. JSON - это просто строковое представление вложенных JS-объектов и массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...