[英]Tricky object flattening
我真的不想重新发明自行车,所以当您拥有这样的对象时,也许有人已经遇到过这种情况:
{
a: {
site1: {
type1: {
item1: 42,
item2: 13
}
},
site2: {
type2: {
item3: 35
}
}
}
}
你需要把它放到一个数组中:
[
[ a, site1, type1, 42],
[ a, site1, type1, 13],
[ a, site2, type2, 35]
]
您需要通过树递归:
const data = {
a: {
site1: {
type1: {
item1: 42,
item2: 13,
},
},
site2: {
type2: {
item3: 35,
},
},
},
};
function walk(data, out, path = []) {
Object.keys(data).forEach(key => {
const newPath = [...path, key];
const value = data[key];
if (typeof value === "object") {
walk(value, out, newPath);
} else {
out.push([newPath, value]);
// Or if you really don't need the value...
//out.push(newPath);
}
});
}
const out = [];
walk(data, out);
console.log(out);
产出
[
[ [ 'a', 'site1', 'type1', 'item1' ], 42 ],
[ [ 'a', 'site1', 'type1', 'item2' ], 13 ],
[ [ 'a', 'site2', 'type2', 'item3' ], 35 ]
]
通过更改注释掉的那一行,您可以获得原始所需的结果,而无需这些值。
这是一个更简单的解决方案:
function flattenObject(objToFlat, path = []) {
return Object.keys(objToFlat).reduce(
(result, key) => [
...result,
...(typeof objToFlat[key] === 'object'
? flattenObject(objToFlat[key], [...path, key])
: [[...path, objToFlat[key]]]),
],
[]
);
}
请注意,您不需要将空数组传递给函数。
您可以在此 plunker 中测试解决方案: http ://plnkr.co/edit/IM5v3fyAMrfV5HKS?open=lib%2Fscript.js
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.