Обход иерархии объектов на основе предоставленных ключей? - PullRequest
1 голос
/ 30 апреля 2019

У меня есть функция, которая принимает следующие аргументы:

set(section, field, pair, component, element, value)

Секция , поле , пара и компонент - это просто ключи внутри объекта.Они являются путевыми точками, поэтому мы можем путешествовать по иерархии.Очевидно, раздел - это голова, наша точка входа.

элемент - это целевой ключ, а значение - это значение, которое будет установлено.

Поскольку элементы расположены на разной глубине, я хотел бы сделать следующее:

set('utility', null, null, null, 'exportId', 'banana')

Это для мелкого доступа, и внутри он будет делать это:

dataObj[section][element] = value;

**/ As in
 * data: {
      utility: {
         exportId: 'banana'
      }
 *  }
 */


В других случаях, когда элемент находится глубже внутри объекта, может потребоваться сделать следующее:

dataObj[section][field][pair][component][element] = value;

Как лучше всего динамически определять путь к элементу, поэтому мы пропускаем ключи, которые передаются как «нулевые»? ​​

, например:

set('history', 'current', null, null, 'fruit', 'apple')

**/ As in
 * data: {
      history: {
         current: {
           fruit: 'apple'
        }
      }
 *  }
 */

будет внутренне построен как:

dataObj[section][field][element] = value;

, как вы могли заметить, мы пропустили [pair][component], потому что эти слоты были переданы как null (s).

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вместо длинного списка конкретных параметров просто передайте объект в функцию. таким образом, вы передаете только то, что вам нужно, и не будет никаких «нулевых» ссылок, чтобы иметь дело с вызовом.

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

Ваша текущая реализация:

 set('utility', 'current', null, null, 'exportId', 'banana')

Использование объекта в качестве параметра:

set({
   section:'utility', 
   field:'current', 
   element: 'exportId', 
   value:'banana'
});
0 голосов
/ 30 апреля 2019

Вы можете использовать остальные параметры , чтобы получить аргументы, передаваемые в массив.Затем создайте объект, используя reduceRight

function set(...paths) { 
  return paths.reduceRight((r, key, i) => key !== null ? { [key] : r } : r)  
}

console.log(set('history', 'current', null, null, 'fruit', 'apple'))
console.log(set('utility', null, null, null, 'exportId', 'banana'))

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

function set(dataObj, ...paths) {
  let value = paths.pop(),
      nested = dataObj;

  for (let i = 0; i < paths.length; i++) {
    const path = paths[i];

    if (i === paths.length - 1 && nested)
      nested[path] = value; // set the value if it's the final item

    if (path !== null && nested)
      nested = nested[path]; // get another level of nesting
  }

  return dataObj;
}

let obj = { utility: { exportId: 'banana' } }

console.log(set(obj, 'utility', null, null, null, 'exportId', 'orange'))

obj = {
  history: {
    current: {
      fruit: 'apple'
    }
  }
}

console.log(set(obj, 'history', 'current', null, null, 'fruit', 'orange'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...