js每个循环为对象或数组添加一个深度

时间:2015-05-14 00:29:59

标签: javascript arrays object

我有这个网页数组的网址,现在我需要制作一个层次结构。

所以从这个:

   allPages = [
       { "url": "/polygon/color/red.html", "name": "Red" }, 
       { "url": "/polygon/color/blue.html", "name": "Blue" }, 
       { "url": "/polygon/shape/tri.html", "name": "Triangle" }, 
       { "url": "/weight/heavy.html", "name": "Heavy Item" }
   ];

对此:

siteMap = [
    polygon:
        color:
            [{url:"red.html", name:"Red"}],
            [{url:"blue.html", name:"Blue"}],
        shape:
            [{url:"tri.html", name:"Triangle"}],
    weight: 
        [{url:"heavy.html", name:"Heavy Item"}],
];

最终结构可以是对象或数组。但我只能使用JS,而不是jQuery或php。

编辑:将输入数据更改为对象数组。抱歉让这更难。

2 个答案:

答案 0 :(得分:3)

小提琴:https://jsfiddle.net/ss92kw4a/2/

几个步骤:

首先我们将字符串拆分为数组:

for(i in all){
    all[i] = all[i].substring(1).split("/");     
}

接下来我们进行递归插入:

function insert(o, a){
    if(a.length == 0){return; }
    if(!o[a[0]]){
        o[a[0]] = {};
    }
    insert(o[a[0]], a.slice(1));
}

我们开始这样的递归:

ans = {};

all.forEach(function(entry){
    insert(ans, entry);
});

全部完成。结果树现在位于ans对象中:

console.log(ans);

enter image description here

更新:此代码使最后一级成为数组:https://jsfiddle.net/ss92kw4a/3/

答案 1 :(得分:0)

您可以使用以下内容:




  var allPages = [
 “/polygon/color/red.html",
 “/polygon/color/green.html",
 “/polygon/color/blue.html",
 “/polygon/shape/tri.html",
 “/polygon/shape/rect.html",
 “/weight/heavy.html",
 “/weight/light.html"
];
var siteMap = {};
 for(var i in allPages){
 var fragments = allPages [i] .match(/ [^ \ / + + / g);
 if(!! pieces){
 var currentMember = siteMap;
 for(var j in fragments){
 fragment = fragments [j];
 if(!currentMember.hasOwnProperty(fragment)){
 currentMember [fragment] = {};
 }
 currentMember = currentMember [fragment];
 }
 }
}
  




可能会得到增强,特别是在结尾的叶子是对象的事实上,
但是它有效