создать объект из массива, используя рекурсию / уменьшить? - PullRequest
0 голосов
/ 05 февраля 2020

Я просто паршив с рекурсивными функциями.

Я хочу превратить это ...

const input = { regions: ["US", "CA", "LA"], checked: true };

... в следующее, используя рекурсию и reduce :

const output = {
  US: {
    CA: {
      LA: true
    }
  }
};

Помощь? Я много чего перепробовал, но мои эксперименты слишком смущают, чтобы ими делиться.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

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

const input = { regions: ["US", "CA", "LA"], checked: true };
const { regions, checked } = input;

const output = regions.reduceRight((a, prop) => ({ [prop]: a }), checked);
console.log(output);
2 голосов
/ 05 февраля 2020

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

const input = { regions: ["US", "CA", "LA"], checked: true };
const getNested = ([key, ...r], end) => key ? {[key]: getNested(r, end)} : end;

console.log(getNested(input.regions, input.checked));
...