Использование переменных с вложенным объектом Javascript
Предположим, что у меня есть это:
var a = { A : { AA : 1 }, B : 2 };
Есть ли способ создать переменную, которая позволила бы мне ссылаться на АА или В? Как выглядит синтаксис?
// I know I can do this:
a['B']; // 2
a['A']['AA']; // 1
// something like this?
var myRef = ???;
a[myRef]; 1 or 2 depending on myRef
Если нет, какой лучший способ получить то, что я собираюсь здесь?
Ответы
Ответ 1
Не напрямую.
Решение 1 - используйте выравнивание объектов
Сгладить объект, чтобы иметь новый объект var a = { 'A.AA' : 1; B : 2 };
.
Смотрите сжатие иерархии объектов в JavaScript
или Сглаживание сложного объекта json для привязки mvc, чтобы получить для него функцию javascript.
Soution 2 - запись ключа доступа к ключам
Я вижу, что уже обращался к Юджину.
Пересмотренная версия, проверенная кодом:
function Leaf(obj,path) {
path=path.split('.');
var res=obj;
for (var i=0;i<path.length;i++) res=res[path[i]];
return res;
}
Решение 3 - используйте eval
var x = eval("a." + myRef); // x will be 1 for myRef == "A.AA", 2 for "B"
Будьте осторожны с этим решением, так как вы можете ввести некоторые проблемы с безопасностью. Это скорее любопытство.
Ответ 2
Так как я также сталкиваюсь с этой проблемой, я написал также одну строку для этого (ES6):
const leaf = (obj, path) => (path.split('.').reduce((value,el) => value[el], obj))
Пример:
const objSample = { owner: { name: 'Neo' } };
const pathSample = 'owner.name';
leaf(objSample, pathSample) //'Neo'
Ответ 3
function Leaf(obj,path) {
path=path.split('.');
var res=obj;
for (var i=0;i<path.length;i++) obj=obj[path[i]];
return res;
}
Лист (а 'В') = 2
Лист (а, 'A.AA') = 1
Украсьте обработку ошибок и т.д. в соответствии с вашими потребностями.
Ответ 4
На самом деле нет, потому что объект js рассматривается как пакеты свойств, а a[X]
- для доступа только к свойствам первого уровня...
Но вы можете обернуть логику a['A']['AA']; // 1
в функции, которая делает то же самое, как это
//WARN... no undefined check here => todo !
function _(o, path) {
var tmp = o
for (var i=0 ; i < path.length ; i++) {
tmp = tmp[path[i]]
}
return tmp
}
var r = _(a, ['A', 'AA'])
Это почти то же самое, что и другие ответы, но разница заключается в том, когда dummy boy создает имя свойства объекта, содержащее точки... Как и var a = {"a.a" : 3 }
.
Теперь такая проблема возникает, может быть, чаще всего с помощью IndexedDB, чтобы хранить что-нибудь локально...
Ответ 5
С функцией lodash _.get вы можете получить доступ к вложенным свойствам с точечным синтаксисом.
Узел серверный пример:
const _ = require('lodash');
let item = { a: {b:'AA'}};
_.get(item, 'a.b');