具有动态嵌套键的对象

时间:2018-09-13 14:00:39

标签: javascript

有一个数组

let arr = [
    ['one','apple','acid','Lorem1'],
    ['one','strawberry','sugar','Lorem2'],
    ['two','melon','water','Lorem3'],
    ['two','melon','sugar','Lorem4'],
    ['three','cow','meat','Lorem5'],
    ['three','peeg','meat','Lorem6']
];

有必要将其变成以下对象:

   let obj = {
        one:{
            apple:{
                acid:{
                    title:'Lorem1'
                }
            },
            strawberry:{
                sugar:{
                    title:'Lorem2'
                }
            }
        },
        two:{
            melon:{
                water:{
                    title:'Lorem3'
                },
                sugar:{
                    title:'Lorem4'
                }
            }
        },
        three:{
            cow:{
                meat:{
                    title:'Lorem5'
                }
            },
            peeg:{
                meat:{
                    title:'Lorem6'


     }
        }
    }
}

我尝试过,但是此退出键是未定义的:

for( row = 1; row<arr.length; row++ ) {
    obj[arr[0]][arr[1]][arr[2]]={
        title:arr[3]
    };
}

但是由于事先未定义索引,因此会产生未定义的错误。

帮助找到正确的决定,只有在“如果”出现时才会出现拐杖。

1 个答案:

答案 0 :(得分:1)

您的代码不起作用,因为使用obj[attr] syntex时javascript不会自动创建空对象,您应该自己创建它。

let arr = [
    ['one','apple','acid','Lorem1'],
    ['one','strawberry','sugar','Lorem2'],
    ['two','melon','water','Lorem3'],
    ['two','melon','sugar','Lorem4'],
    ['three','cow','meat','Lorem5'],
];

let obj = {}

for(let attrs of arr){
  let current = obj;
  for(let i=0;i<attrs.length-1;++i){
    if(!current[attrs[i]])
      current[attrs[i]]={}
    current=current[attrs[i]]
  }
  current['title']=attrs[attrs.length-1]
}

console.log(obj)