Задать вопрос
@SirAlejandro

Как создать плоский объект из вложенного?

Есть объекты типа:

const example = {
  a: 5,
  b: {
    c: 57,
    d: {
      e: 6
    }
  }
}

То есть, вложенность может быть не ограничена. Как можно "развернуть" объект, чтобы все свойства в нем стали корневыми и именовались через точку? Т.е., вот так: 'example.b.d.e' : 6.
  • Вопрос задан
  • 901 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

const nestedToPlain = (obj, path = '') =>
  Object.entries(obj).reduce((acc, [ k, v ]) => {
    const newPath = `${path}${path ? '.' : ''}${k}`;
    return Object.assign(acc, v instanceof Object
      ? nestedToPlain(v, newPath)
      : { [newPath]: v }
    );
  }, {});


const plain = nestedToPlain(example, 'example');

или

const nestedToPlain = (obj, keys = []) =>
  Object.entries(obj).reduce((acc, [ k, v ]) => (
    keys.push(k),
    Object.assign(acc, v instanceof Object
      ? nestedToPlain(v, keys)
      : { [keys.join('.')]: v }
    ),
    keys.pop(),
    acc
  ), {});


const plain = nestedToPlain(example, [ 'example' ]);

Рекурсии нет:

const nestedToPlain = function(obj, keys = []) {
  const result = {};
  const [ push, pop ] = this;

  for (const stack = [ obj ]; stack.length;) {
    const n = stack.pop();
    if (n instanceof Object) {
      Object.entries(n).reverse().forEach(([ k, v ]) => stack.push(pop, v, k, push));
    } else if (n === push) {
      keys.push(stack.pop());
    } else if (n === pop) {
      keys.pop();
    } else {
      result[keys.join('.')] = n;
    }
  }

  return result;
}.bind([ Symbol(), Symbol() ]);


const plain = nestedToPlain(example, [ 'example' ]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Рекурсивно обойти объект в глубину через for ... in.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы