gpt4 book ai didi

javascript - 展开 JS 对象并转换数组

转载 作者:行者123 更新时间:2023-11-29 15:22:16 27 4
gpt4 key购买 nike

我有一个函数可以像这样压平对象:

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

它需要是 vanilla JS,但 es2015 没问题。它假定任何数字键实际上是数组的一部分。

如果有人有任何建议,我们将不胜感激!

最佳答案

当你发现 key 不在 final 中时,你应该检查路径中的下一个键是否只有数字(使用正则表达式),并且,如果是这样,分配给一个数组而不是一个对象:

if (!(key in final)) {
final[key] = /^\d+$/.test(path[i + 1]) ? [] : {};
}

let object = {
a: 1,
b: [{
c: 2
},
{
c: 3
}
]
};

let flattened = {
'a': 1,
'b.0.c': 2,
'b.1.c': 3
}

function unflatten(obj) {
let final = {};

for (let prop in obj) {
assign(final, prop.split('.'), obj[prop]);
}

return final;
}

function 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] = /^\d+$/.test(path[i + 1]) ? [] : {};
}
final = final[key];
}
final[path[lastKeyIndex]] = value;
}

console.log(unflatten(flattened))
.as-console-wrapper { min-height: 100vh; }

关于javascript - 展开 JS 对象并转换数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42641629/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com