我有一个函数用于将对象展开成如下形式:
let object = {
a: 1,
b: [
{ c: 2 },
{ c: 3 }
]
};
flatten(object)
// returns {
'a': 1,
'b.0.c': 2,
'b.1.c': 3
}
我需要展开对象,但也需要将数组还原到之前的状态。我有以下代码:
unflatten(obj) {
let final = {};
for (let prop in obj) {
this.assign(final, prop.split('.'), obj[prop]);
}
return final;
}
assign(final, path, value) {
let lastKeyIndex = path.length-1;
for (var i = 0; i < lastKeyIndex; ++ i) {
let key = path[i];
if (!(key in final)) {
final[key] = {};
}
final = final[key];
}
final[path[lastKeyIndex]] = value;
}
这基本上是有效的,但它对数组的处理方式如下:
{
a: 1,
b: { // Notice how b's value is now an object
"0": { c: 2 }, // Notice how these now have a key corresponding to their index
"1": { c: 3 }
}
}
相较之前,我需要b
仍然是一个数组:
{
a: 1,
b: [
{ c: 2 },
{ c: 3 }
]
}
我不知道该从哪里继续了。它需要能够处理任意数量的数组,例如:
'a.b.0.c.0.d',
'a.b.0.c.1.d',
'a.b.1.c.0.d',
'a.b.1.c.1.d',
'a.b.1.c.2.d',
// etc
需要使用原生JS,但使用es2015也可以。假定任何数字键都是数组的一部分。
如果有任何建议,将不胜感激!