我有一个字符串数组,我想转换为键为数组值的嵌套对象。我尝试过reduce,但是嵌套在最后一个对象中的所有值都是数组中的最后一个项目。你能帮助我吗? 谢谢!
let m = [
'1.',
'1.1.',
'1.2.',
'1.3.',
'1.4.',
'1.1.1.',
'1.1.2.',
'1.1.3.',
'1.2.1.',
'1.2.2.',
'1.3.1.',
'1.3.2.',
'1.3.3.',
'1.3.4.',
'1.4.1.',
'1.4.3.',
];
我想将此数组转换为嵌套对象。
返回
{
"1":{
"1":{
"1":"1.1.1.",
"2":"1.1.2.",
"3":"1.1.3."
},
"2":{
"1":"1.2.1.",
"2":"1.2.2."
},
"3":{
"1":"1.3.1.",
"2":"1.3.2.",
"4":"1.3.4."
},
"4":{
"1":"1.4.1.",
"3":"1.4.3."
}
}
}
答案 0 :(得分:1)
这是一个使用reduce()的有效示例。
let m = [
'1.',
'1.1.',
'1.2.',
'1.3.',
'1.4.',
'1.1.1.',
'1.1.2.',
'1.1.3.',
'1.2.1.',
'1.2.2.',
'1.3.1.',
'1.3.2.',
'1.3.3.',
'1.3.4.',
'1.4.1.',
'1.4.3.',
];
const addToObj = (obj_, path, newData) => {
const obj = typeof obj_ === 'string' ? {} : obj_ // Special logic to cause a value at 1.2.3. to override a value at 1.2.
if (path.length === 0) return newData
const [head, ...tail] = path
return {
...obj,
[head]: addToObj(obj[head] || {}, tail, newData),
}
}
const res = m.reduce(
(obj, path) => addToObj(obj, path.split('.').slice(0, -1), path),
{}
)
console.log(res)
它通过使用addToObj函数来工作,该函数将一个对象作为参数,该对象的路径以及该路径末尾所需的新值,并将使用新的对象返回一个新对象。增值。
在addToObj()中添加了特殊逻辑,以确保像1.2.3.
这样的键总是改写可能放在1.2.
处的字符串值。