对象的递归路径

时间:2018-07-03 11:36:03

标签: javascript lodash

我正在考虑用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 :(得分:0)

不确定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);