Рекурсивный путь для объекта - PullRequest
0 голосов
/ 03 июля 2018

Я думаю об оптимальном способе преобразования объекта с помощью lodash.

Я хочу сохранить древовидную структуру, но указать путь как массив или объединенную строку.

{ 
    a: 1, 
    b: { 
        a: 1, 
        b: { 
            q: 1, 
            g: 1
        }, 
        c: 1
    }, 
    e: 1
}

до

{ 
    a: { path:['a'], value: 1 }, 
    b: { 
        a: { path:['b', 'a'], value: 1 }, 
        b: { 
            q: { path:['b', 'b', 'q'], value: 1 }, 
            g:{ path:['b','b','g'], value: 1 } 
        }, 
        c: { path:['b','c'], value: 1 }
    }, 
    e: { path:['e'], value: 1 }
}

У меня есть эта версия:

const deeply = (map) => (obj, fn) => 
  map(_.mapValues(obj, (v) => {
    return _.isPlainObject(v) ? deeply(map)(v, fn) : v; 
  }), fn);

Есть идеи?

1 Ответ

0 голосов
/ 03 июля 2018

Не уверен, что в lodash есть что-то встроенное.

Но всякий раз, когда вы видите подобные конструкции, вы начинаете думать о рекурсии ..

Вот пример без использования lodash ..

const data = { 
    a: 1, 
    b: { 
        a: 1, 
        b: { 
            q: 1, 
            g: 1
        }, 
        c: 1
    }, 
    e: 1
};

function transform(src, arr = []) {
  const ret = {};
  Object.entries(src).forEach(([k, value]) => {
    const path = arr.concat(k);
    if (typeof value === "object") {
      ret[k] = transform(value, path);
    } else {
      return ret[k] = {path, value};
    }
  });
  return ret;
}

const t = transform(data);

console.log(t);
...