我正在考虑用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);
有什么想法吗?
答案 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);