2016-01-12 5 views
1

Ситуация: Я получаю массив JSON от jQuery < -> PHP Ajax запрос. Вот структура неанализируемого JSON Арай:Как получить доступ ко всем вложенным ассоциативным элементам массива?

{"Focus":{"id":2,"brand":"Ford","name":"Focus"}} 

И после использования JSON.parse(json); структура выглядит следующим образом:

Focus: Object 
     brand: "Ford" 
     id: 2 
     name: "Focus" 

Проблема: Я хочу, чтобы получить доступ к элементам всех массива «1-й эшелон» и использовать их как объекта, но ни один из нижеперечисленных способов не работает:

for (var entity in dataTable) 
{ 
    formattedText += entity['brand'] + " " + entity['name'] + "<br>"; 
    OR 
    formattedText += entity.brand + " " + entity.name + "<br>"; 
    OR 
    formattedText += dataTable[0]['brand'] + " " + dataTable[0]['name'] + "<br>"; 
} 

Любые решения, как считывать значения всего объекта в этом порядке ау?

ответ

3

for..in цикл использует ключи и не возвращают элементы сам себе: for (var key in dataTable)
Затем вы должны получить доступ к каждому элементу с помощью dataTable[key]. Клавиша на самом деле является именем Элемента.

Вы используете его, как если бы вы использовали цикл for..of, но это новая функция, которая пока не поддерживается во всех браузерах.

Демо:

var dataTable = {"Focus":{"id":2,"brand":"Ford","name":"Focus"}} 
 

 
var formattedText = "" 
 
for (var key in dataTable) 
 
{ 
 
    formattedText += dataTable[key]['brand'] + " " + dataTable[key]['name'] + "<br>"; 
 
} 
 

 
document.write(formattedText)

0

Правильный синтаксис, чтобы написать это было бы:

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

var dataTable = JSON.parse('{"Focus":{"id":2,"brand":"Ford","name":"Focus"}}'); 
var formattedText = ''; 
for (var entity in dataTable.Focus) { 
    formattedText += dataTable.Focus['brand'] + " " + dataTable.Focus['name'] + "<br>"; 
} 
0

Похоже, что вы используете каждую функцию в неправильном направлении. в ваших аргументы каждого изменения функции к ключу и значению, как это:

$.each(dataTable, function (key, value) { 
    //access key and values here 
}); 

В вашем случае и должен повторять снова через ключ и значения ваших ключевых значений.

1

Object.keys будет возвращать массив всех ключей object

Вы можете цикл (forEach/for-loop) через keys, чтобы получить ожидаемый результат.

Использование forEach:

var dataTable = { 
 
    "Focus": { 
 
    "id": 2, 
 
    "brand": "Ford", 
 
    "name": "Focus" 
 
    } 
 
} 
 
var keys = Object.keys(dataTable); 
 
var str = ''; 
 
keys.forEach(function(item) { 
 
    str += dataTable[item].brand + " " + dataTable[item].name; 
 
}); 
 
alert(str);

Использование for-loop:

var dataTable = { 
 
    "Focus": { 
 
    "id": 2, 
 
    "brand": "Ford", 
 
    "name": "Focus" 
 
    } 
 
} 
 
var keys = Object.keys(dataTable); 
 
var str = ''; 
 
for (var i = 0, len = keys.length; i < len; i++) { 
 
    str += dataTable[keys[i]].brand + " " + dataTable[keys[i]].name; 
 
} 
 
alert(str);

+0

Разве это не то же самое, как 'for..in' л oop, но медленнее и сложнее? – CoderPi

+0

Это быстрее, чем 'for..in' => http://jsperf.com/object-keys-vs-for-in/3 – Rayon

+0

Тест использует' hasOwnProperty' для каждого элемента, который не является обязательным – CoderPi

Смежные вопросы