将字符串数组转换为嵌套对象

时间:2020-11-12 04:18:48

标签: javascript arrays object

我有一个字符串数组,我想转换为键为数组值的嵌套对象。我尝试过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."
        }
     }
    }

1 个答案:

答案 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.处的字符串值。