2016-06-18 3 views
-1

У меня есть переменная, содержащая строку проверенного JSON. JSON представляет собой набор строк, каждый из которых имеет значение массива. Я хотел бы получить доступ к строкам и каждому значению массива.JS доступ к массиву с объектом в объекте

var json_string = {"div-1":["div-1A", "div-1B"], "div-2":["div-2A", "div-2B"]}; 

//Run some code to get the following result: 
console.log("div-1" has "div-1A"); 
console.log("div-1" has "div-1B"); 
console.log("div-2" has "div-2A"); 
console.log("div-2" has "div-2B"); 

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

console.log(json_string["div-1"]); 

я случайно получить следующие результаты для каждого обновления страницы:

div-1A //initial load 
div-1C //refresh 1 
div-1A //refresh 2 
div-1B //etc 
div-1A //etc 

Любые идеи, как я могу получить то, что я после?

+0

Что такое 'console.log ("ДИВ-1" имеет "Div-1А");'? Вы пробовали 'indexOf()'? – Rajesh

+0

Что это? Объект или строка JSON? – BotNet

+0

Как вы получаете строку JSON? Возможно, вы получаете разные значения, потому что вы загружаете или назначаете разные значения. – BotNet

ответ

1

Вы можете сначала извлекать значения из ключей, а затем использовать forEach, чтобы получить их значение

var json_string = {"div-1":["div-1A", "div-1B"], 
        "div-2":["div-2A", "div-2B"] 
        }; 
for(var key in json_string){ 
var _getValue = json_string[key] 
if(_getValue.constructor===Array){ // Checking if it is an array 
     _getValue.forEach(function(item){ 

     document.write('<pre>'+item+'</pre>') 
    }) 
    } 

JSFIDDLE

+0

Кто-то проголосовал за весь ответ! – brk

+0

Не я, но у меня нет достаточного количества голосов для голосования. Я буду, когда смогу. –

+0

Спасибо вам, сэр! Не ошибка – brk

1

Использование Object.keys() для получения ключей объектов и Array#forEach для итерация массива.

var json_string = { 
 
    "div-1": ["div-1A", "div-1B"], 
 
    "div-2": ["div-2A", "div-2B"] 
 
}; 
 

 
// Get all object keys and iterate over them 
 
Object.keys(json_string).forEach(function(key) { 
 
    // Get inner array using key and iterate 
 
    json_string[key].forEach(function(el) { 
 
    console.log(key + ' has ' + el) 
 
    }); 
 
});


Для старшего проверки браузера вариант polyfill для Object.keys method и forEach method.

+0

Спасибо, это тоже работает. Заметьте, что я читал в другом месте, что object.keys не поддерживается IE8 и старше для всех, кто читает это. –

+0

@ KeithC. : вы можете использовать опцию polyfill для этого ..... –

1

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

for (key in json_string) { 
    var arr = json_string[key]; 
    arr.forEach(function(item) { 
     console.log(key + ' has ' + item); 
    }); 
} 
+0

Спасибо за ответ. Кажется, это не работает. Результатом в консольном журнале были также случайные результаты, такие как div-1, имеет div-1C, div-1 имеет div-1A, div-1 имеет div-1B, div-1 имеет div-1A. –

+0

Пренебрежение выше комментария, произошел столкновение данных что-то в моем рабочем коде. Это работает. Спасибо. –

1

Похоже, ваш json_string фактически объект JSON (есть разница). Тем не менее, ключи внутри объекта не следуют никаким сортировкам/заказам. Вам нужно будет сортировать ключи до вашего выхода:

var obj = { 
 
    "div-1": ["div-1A", "div-1B"], 
 
    "div-2": ["div-2A", "div-2B"] 
 
}; 
 

 
Object.keys(obj).sort().forEach(key => 
 
    obj[ key ].sort().forEach(val => 
 
    console.log([key,'has',val].join(' ')) 
 
) 
 
);

Конечно, вы также можете написать свою собственную функцию для вывода значений для конкретного ключа. Ниже добавляет функцию прототип Object, который является только примером (макетирование, как правило, не рекомендуется):

Object.prototype.valuesFor = function(key){ 
 
    this[key].sort().forEach(val => 
 
    console.log([key,'has',val].join(' ')) 
 
) 
 
    return this[key]; 
 
}; 
 

 
var obj = { 
 
    "div-1": ["div-1A", "div-1B"], 
 
    "div-2": ["div-2A", "div-2B"] 
 
}; 
 

 
obj.valuesFor('div-1')

+0

Очень хорошо, имеет смысл. Это также работает. Спасибо. –

+0

Мне нравится, как люди оставляют отрицательные моменты, не выходя из комментариев. – BotNet

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