Цикл по объекту для извлечения данных из другого вложенного объекта

86
10

Я пытаюсь перебрать значения объекта, которые, в свою очередь, являются собственными объектами с данными, которые я хочу получить. Я пытаюсь получить данные, которые соответствуют динамически создаваемой переменной, а не жестко заданному пути. Единственные решения, которые я могу найти, - это объекты, к которым прикреплены данные на верхнем уровне, не вложенные в другой объект. Ниже приведен простой вариант моей проблемы. Заранее спасибо.

const VMs = {
'VM01': {
"1": "value1",
"2": "value2",
"3": "value3"
},
'VM02': {
"1": "value1",
"2": "value2",
"3": "value3"
},
'VM03': {
"1": "value1",
"2": "value2",
"3": "value3"
}
};

const thisVM = 'VM03'; // Hardcoded here but actually this.$route.params.data (data not defined in this example)

for (let obj in VMs) {
console.log(obj) // this is only a string of the key eg "VM01". I
// want obj to be an object where I can reference its data.

if (obj = thisVM) {

// get data from this VM

}
}

спросил(а) 2020-04-04T02:21:38+03:00 3 месяца назад
1
Решение
84

Используйте VMs[obj] чтобы получить объект.

Ваш оператор if содержит опечатку, = должно быть == для сравнения.

Но в первую очередь нет необходимости в петле. Вы можете просто использовать VMs[thisVM] чтобы получить VMs[thisVM] объект. См. Динамический доступ к свойству объекта с помощью переменной

const VMs = {
'VM01': {
"1": "value1",
"2": "value2",
"3": "value3"
},
'VM02': {
"1": "value1",
"2": "value2",
"3": "value3"
},
'VM03': {
"1": "value1",
"2": "value2",
"3": "value3"
}
};

const thisVM = 'VM03'; // Hardcoded here but actually this.$route.params.data (data not defined in this example)

for (let obj in VMs) {
console.log(VMs[obj]) // this is only a string of the key eg "VM01". I
// want obj to be an object where I can reference its data.

if (obj == thisVM) {

// get data from this VM

}
}

ответил(а) 2020-04-04T02:31:47.384607+03:00 3 месяца назад
39

Я не совсем уверен, каковы ваши намерения, но если вы хотите получить доступ к вложенным реквизитам, вы можете использовать метод Object.entries, например:

const VMs = {
'VM01': {
"1": "value1",
"2": "value2",
"3": "value3"
},
'VM02': {
"1": "value1",
"2": "value2",
"3": "value3"
},
'VM03': {
"1": "value1",
"2": "value2",
"3": "value3"
}
};

const thisVM = 'VM03';

Object.entries(VMs).forEach(([prop, val]) => {
console.log(val)
if (prop === thisVM) {
// Your action
}
})

Если глубина вложения больше или неизвестна, лучше использовать рекурсивный обход.

ответил(а) 2020-04-04T02:21:38+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема