JS-функция, которая регистрирует свойства вложенных объектов, где свойства передаются как параметры - PullRequest
0 голосов
/ 13 июня 2019

У меня есть следующий объект:

let a = {
    aa: {
        aaa: 1
    },
    ab: {
        aba: {
            abaa: 2
        }
    }
}

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

func(a, 'aa', 'aaa') // 1
func(a, 'ab', 'aba', 'abaa') // 2

Я могу сделать это, если число параметров фиксировано, например:

function func() {
    console.log(arguments[0][arguments[1]][arguments[2]])
}

Кто-нибудь знает, как я могу написать func() такчто он примет произвольное количество аргументов?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 13 июня 2019

Используйте reduce с arguments:

let a = {
  aa: {
    aaa: 1
  },
  ab: {
    aba: {
      abaa: 2
    }
  }
}

function func() {
  console.log([...arguments].reduce((a, c) => a[c]));
}

func(a, 'aa', 'aaa');
func(a, 'ab', 'aba', 'abaa');

Если вам не нравится arguments, используйте отдых и растяжение ...:

let a = {
  aa: {
    aaa: 1
  },
  ab: {
    aba: {
      abaa: 2
    }
  }
}

function func(...args) {
  console.log(args.reduce((a, c) => a[c]));
}

func(a, 'aa', 'aaa');
func(a, 'ab', 'aba', 'abaa');
2 голосов
/ 13 июня 2019

Цикл по arguments в зависимости от его длины:

function func() {
    var obj = arguments[0];
    for(var i = 1; i < arguments.length; ++i) {
        obj = obj[arguments[i]];
    }
    return obj;
}

Или, если вы используете современный JavaScript, вы можете сделать это следующим образом:

function func(obj, ...keys) {
    keys.forEach(key => obj = obj[key]);
    return obj;
}
1 голос
/ 13 июня 2019

Удобно иметь дело с произвольным числом аргументов с помощью es6 деструктурирующего присваивания

function logNestProperties(obj, ...args) {
    let value = args.reduce((acc, cur) => acc[cur], obj);
    console.log(value || 'illegal properties');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...