#javascript #jquery #json #loops
#javascript #jquery #json #циклы
Вопрос:
У меня есть один чрезвычайно сложный объект json, мне нужно записать все свойства и ключи такими, какие они есть. У меня есть концепция, которая просто не может получить выполнение.
Необходимость постоянно вызывать функцию, если у объекта есть объект и так далее. Однако я сталкиваюсь с проблемами, некоторые ключи не выводятся, некоторые значения разбиваются как
0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc....
name:Travel
scheme:
label:
Я предполагаю, что где-то в моем коде есть небольшая ошибка, которую необходимо изменить.
ObjectValues = function(obj){
for(var j in obj){
if(typeof(obj[j]) == "object"){
for(var k in obj[j]){
ObjectValues(obj[j][k]);
}
} else {
console.log(j ":" obj[j]);
}
}
_
{
"title": "Norway Tourism: Wildlife and Nature",
"author": "",
"categories": [
{
"name": "Travel",
"scheme": "",
"label": ""
}
],
"countries": [
],
"content": [
{
"thumbnails": [
{
"audioChannels": 0,
"audioSampleRate": 0,
"bitrate": 0,
"checksums": {
"md5": "7089E4E044069AE7702DEC686"
}
}
]
}
]
}
Ответ №1:
ObjectValues = function(v, k){
if (typeof v == "object") {
for (var kp in v) {
if (Object.hasOwnProperty.call(v, kp)) {
ObjectValues(v[kp], k != undefined ? k "." kp : kp);
}
}
} else {
console.log(k ":" v);
}
};
должно работать даже для значений JSON, которые не являются объектами. Это будет работать для
ObjectValues(JSON.parse("0"));
который не будет обрабатываться оригиналом, и он не будет перебирать символы в строке верхнего уровня, если вы это сделаете ObjectValues("http://...")
.
Комментарии:
1. Не удастся напечатать ключ «x», например
ObjectValues( { x:{y:"1"} } )
.2. @frunsi, серьезно? Работает для меня. В каком браузере вы тестируете?
3. Я думаю, он хочет напечатать всю иерархию.
4. @frunsi, я думаю, исправлено. Я все еще не уверен, что именно требуется.
5. Это работает очень хорошо, мне нужно будет немного подправить его, чтобы он не возвращал 0 при вводе другого объекта. Кроме этого, большое спасибо! : D
Ответ №2:
Использование:
ObjectValues = function(obj) {
var isArray = obj instanceof Array;
for (var j in obj) {
if (obj.hasOwnProperty(j)) {
if (typeof(obj[j]) == "object") {
if(!isArray)
{
console.log(j ":");
}
ObjectValues(obj[j]);
} else if(!isArray) {
console.log(j ":" obj[j]);
}
}
}
}
Обратите внимание на удаленный цикл. То, как вы его разделяли, приводило к потере k
имен.
Вы также должны использовать свойство hasOwnProperty, чтобы избежать сериализации нежелательных ключей.
Если значение является объектом, вы все равно хотите сериализовать ключ (например, вы не хотите терять foo for {foo: {} }
).
Наконец, мне пришлось выполнить проверку массива, потому что массивы — это объекты, и мы хотим выводить ключи, вложенные в массивы, но мы не хотим выводить сами индексы массива.
Демонстрация в jsFiddle.
Комментарии:
1. Не будет ли это по-прежнему терпеть неудачу
ObjectValues("http://...")
, как в OP:0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc....
?2. Это было в значительной степени на месте: единственная проблема, заключающаяся в том, что категории по-прежнему возвращаются, как в примере
name:Travel scheme: label:
, вместоcategories: name:Travel scheme: label:
Ответ №3:
Не могу сказать, что это единственная проблема, но вам не хватает запятой после массива стран.
Кроме того, для таких сегментов, как «категории» (и других), вы уверены, что его нужно заключить в квадратные скобки? В терминах JS это массив. Итак, я полагаю, вы говорите, что у вас есть массив, но в данном случае единственным членом этого массива является объект.
Комментарии:
1. Это всего лишь фрагменты гораздо большего файла JSON. Я не контролирую, как он возвращается, извините, если бы я это сделал, не выглядел бы так: D
2. Отлично. Он по-прежнему будет возвращать тип object , но вы должны убедиться, что вы правильно его изучаете. Однако пропущенная запятая является проблемой, поскольку она создает недопустимый JSON.
Ответ №4:
Поскольку на ваш вопрос есть тег jquery:
Я лично использую плагин jquery.dump для таких целей.