Доступ javascript значение объекта по массиву - PullRequest
1 голос
/ 05 августа 2020

У меня есть объект вроде: const obj = { 'abc': {'def': 1 } } и массив вроде const arr = ['abc', 'def'] Как мне получить доступ к свойству obj.abc.def моего объекта с помощью массива?

Очевидно, obj[arr] не работает, также obj[arr.join('.') не работает.

Я хочу сделать следующее:

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def']

const value = obj[arr] // crash 
// value should contain 1                                 

Ответы [ 6 ]

1 голос
/ 05 августа 2020

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

const
    getValue = (object, keys) => keys.reduce((o, k) => (o || {})[k], object),
    obj = { abc: { def: 1 } },
    arr = ['abc', 'def'],
    value = getValue(obj, arr);

console.log(value);
console.log(getValue(obj, ['foo', 'bar']));
1 голос
/ 05 августа 2020

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def']

var value = obj;

for(let key of arr){
  value = value[key];
}

console.log(value);
1 голос
/ 05 августа 2020

База

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def']

console.log(obj[arr[0]][arr[1]]);

или, если вам нужно сделать это с помощью функции ...

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def']

function access(obj, arr) {
  return arr.reduce((o, key) => o[key], obj);
}

console.log(access(obj, arr));
1 голос
/ 05 августа 2020

Вы можете получить доступ к свойству массива только по индексу. поэтому arr[0] будет работать.

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def']

const value = obj[arr[0]][arr[1]]
console.log(value)

или вы можете запустить l oop поверх него.

const obj =  { 'abc': {'def' : {'ghi': 1 } } };
const arr = ['abc', 'def', 'ghi'];
let ans = null;

for (let i=0; i<arr.length; i++) {
  if(i==0) {
    ans = obj[arr[0]];
  }
  else {
    ans = ans[arr[i]];
  }
}
console.log(ans)
0 голосов
/ 05 августа 2020
• 1000 колесо (практика - это нормально)

В вашем контексте метод ramda path может помочь вам достичь случай произвольного массива свойств

const obj = {
  'abc': {
    'def': 1,
    'ghi': {
      'jkl': 10
    }
  }
}

console.log(R.path(['abc', 'def'], obj))
console.log(R.path(['abc', 'ghi'], obj))
console.log(R.path(['abc', 'ghi', 'jkl'], obj))
console.log(R.path(['abc', 'ghi', 'jkl', 'mno'], obj))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
0 голосов
/ 05 августа 2020

Вы можете использовать Array#reduce для динамического c массива.

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def']
const res = arr.reduce((o,prop)=>o[prop], obj);
console.log(res);

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

const obj =  { 'abc': {'def': 1 } }  
const arr = ['abc', 'def', 'notdefined', 'notdefined2']
const res = arr.reduce((o,prop)=>o?.[prop], obj);
console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...