Подтвердить что ты не робот

Использование переменных с вложенным объектом 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

Если нет, какой лучший способ получить то, что я собираюсь здесь?

4b9b3361

Ответ 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');