【发布时间】:2017-07-27 06:25:16
【问题描述】:
我有一个函数可以像这样展平对象:
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 没问题。它假设任何一个数字键实际上都是数组的一部分。
如果有人有任何建议,不胜感激!
【问题讨论】:
标签: javascript arrays json object ecmascript-6