Получить массив всех путей Lodash объекта - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь выяснить, есть ли простой способ получить список всех «путей» (как определено Lodash) объекта.

То есть:

getPaths({ a: 3, b: { c: 4, d: 0 }})

=> 
[
  ['a'],
  ['b', 'c'],
  ['b', 'd']
]

Есть ли такой механизм в Лодаше?Или простой способ его создания?

Ответы [ 5 ]

2 голосов
/ 16 апреля 2019

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

function getPaths(object) {
    return object && typeof object === 'object' && Object.keys(object).reduce((p, k) => 
        (getPaths(object[k]) || [[]]).reduce((r, a) =>
            [...r, [k, ...a]], p), []);
}

console.log(getPaths({ a: 3, b: { c: 4, d: 0 } }));
1 голос
/ 16 апреля 2019

Нет готового метода, но вы можете использовать _.transform() рекурсивно, чтобы получить пути:

const getPaths = o =>
  _.transform(o, (acc, v, k) => {

    const keys = _.isObject(v) && !_.isEmpty(v) ? 
      _.map(getPaths(v), sk => _.concat(k, ...sk))
      :
      [[k]];
  
    acc.push(...keys);
  }, []);


const result = getPaths({ a: 3, b: { c: 4, d: 0 }, e: {}, f: [{ g: {h: 5}}] });

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
1 голос
/ 16 апреля 2019

Вы можете использовать рекурсивный подход следующим образом.

const getPaths = (obj, arr = [], res = []) => {
  Object.entries(obj).forEach(([key, value]) => {
    if (typeof value === 'object' && value) getPaths(value, [...arr, key], res)
    else res.push([...arr, key])
  });
  return res;
}


console.log(getPaths({ a: 3, b: { c: 4, d: 0 }}));
0 голосов
/ 16 апреля 2019

Хорошо, если нет включенного метода, вот мой ответ:

function getPaths(obj, prefix = []) {
  return Object.keys(obj).reduce((arr, key) => {
    const path = [...prefix, key];
    const content = typeof obj[key] === 'object' ? getPaths(obj[key], path) : [path];
    return [...arr, ...content];
  }, []);
}
       
console.log(getPaths({ a: 3, b: { c: 4, d: 0, e: { f: 9} }}));
;
0 голосов
/ 16 апреля 2019

Рекурсивная функция:

function getPaths(obj, prefix) {
  let result = Object.keys(obj).map(key => {
    if (typeof obj[key] == "object" && obj[key] != null) {
      return getPaths(obj[key], key);
    } else {
      return prefix ? [prefix, key] : key;
    }
  });
  return result;
}

console.log(getPaths({ a: 3, b: { c: 4, d: 0 }}));
...