这是关于数组和对象这2种数据结构的存储和转换的2道题,相信你看了和做了之后会有所收获。
1.将对象转换成二维数组
var scoreObject = {
"Tony": {
"Math": 95,
"English": 79,
"Music": 68
},
"Simon": {
"Math": 100,
"English": 95,
"Music": 98
},
"Annie": {
"Math": 54,
"English": 65,
"Music": 88
}
}
//转换为如下所示数组
// var scoreArray = [
// ["Tony", 95, 79, 68],
// ……
// ];
思路就是:用for in的循环嵌套,先把内层的成绩属性push进数组arr1,然后在外层push进名字的属性,最后把arr1 push进arr2,清空arr1,然后下一个对象属性(人),如此类推,最后,每一个人的名字和成绩都会被push进arr2,成为他的元素。
打印。
代码:
function changeObject(){
var arr1 = [];
var arr2 = [];
for(var x in scoreObject){
arr1.push(x);
for(var y in scoreObject[x]){
arr1.push(scoreObject[x][y]);
}
arr2.push(arr1);
arr1 = [];
}
return arr2;
}
console.log(changeObject());
转换结果:
2.将数组转换为对象
// 数组转为对象:
var menuArr = [
[1, "Area1", -1],
[2, "Area2", -1],
[3, "Area1-1", 1],
[4, "Area1-2", 1],
[5, "Area2-1", 2],
[6, "Area2-2", 2],
[7, "Area1-2-3", 4],
[8, "Area2-2-1", 6],
];
//转换成后的样子:
var menuObject = {
"1": {
name: "Area1",
subMenu: {
"3": {
name: "Area1-1"
},
"4": {
name: "Area1-2",
subMenu: {
"7": {
name: "Area1-2-3"
}
}
}
}
}
……
}
思路:遍历数组,判断元素,如果是-1,代表他是第一层的对象,动态添加到新创建的menuObject对象上,同时设置好里面的属性,这样第一层的1,2转换完成。然后继续判断元素,根据需求,如果是1,将出现在第二层,并且是第一层1的子对象,一样地,动态添加到第一层1的属性subMenu里面,并设置好里面的属性。下面的如此类推。
对于这题,我没有很好的想法,虽然实现了需求,但是用了比较笨拙的方法,当数据量变大的时候,这种代码的编写变得难以接受。比如动态添加的那行的代码可能越来越长,比如需要加上很多的判断,第n层需要,(n-1)² 个判断。所以,以后有了更加高效和优雅的解决方法后会再加以补充。
var menuObject = {};
for(var x in menuArr){
// console.log(menuArr[x][1]);
if(menuArr[x][2] == -1){
menuObject[menuArr[x][0]] = {
'name' : menuArr[x][1],
'subMenu':{}
}
}
if(menuArr[x][2] == 1){
menuObject['1']['subMenu'][menuArr[x][0]] = {
'name' : menuArr[x][1],
'subMenu' : {}
}
}
if(menuArr[x][2] == 2){
menuObject['2']['subMenu'][menuArr[x][0]] = {
'name' : menuArr[x][1],
'subMenu' : {}
}
}
if(menuArr[x][2] == 4){
menuObject['1']['subMenu']['4']['subMenu'][menuArr[x][0]] = {
'name' : menuArr[x][1],
'subMenu' : {}
}
}
if(menuArr[x][2] == 6){
menuObject['2']['subMenu']['6']['subMenu'][menuArr[x][0]]={
'name' : menuArr[x][1],
'subMenu' : {}
}
}
}
console.log(menuObject);
转换结果如下,8个节点按要求进行添加了