js 怎么生成树结构,算法太烂

2015-06-16 12:25:07 +08:00
 coolicer
var arr = [
    {id:1, pid:0, name:"SYSTEM"},
    {id:2, pid:1, name:"aa"},
    {id:3, pid:2, name:"aaa"},
    {id:4, pid:2, name:"b"},
    {id:5, pid:0, name:"c"},
    {id:6, pid:5, name:"cc"}
];


/*
var result = [{
        "name": "SYSTEM",
        "expanded": true,
        "id": 0,
         "items": [
                   {
                        name: "Sub",
                       "expanded": true,
                        "id":1,
                       "pid":0,
                       "items":[ ......]
                   },
                   {}
 } ];
*/

遇到这样的就傻眼了,99

7472 次点击
所在节点    JavaScript
35 条回复
imn1
2015-06-16 13:30:37 +08:00
@czheo
那要看用户群,反正我这台机不敢在浏览器乱按 F12
iNaru
2015-06-16 13:38:31 +08:00
var temp = [];
for(var i in arr){
arr[i].expanded = true;
var id = arr[i].pid - 1;
(id in arr ? (arr[id].items || (arr[id].items = [])) : temp).push(arr[i])
}
console.log(temp);
oxyflour
2015-06-16 13:41:01 +08:00
@Septembers 会炸的(但是用 ff 试了,深度要到好几千呢,比如下面这个就不会炸
tree(0, Array.apply(null, new Array(2048)).map((v, i) => { return {id:i+1, pid:i} }))
iNaru
2015-06-16 13:41:43 +08:00
@iNaru 这个原数组会被污染,之前最好用克隆的数组进行。
Septembers
2015-06-16 13:48:00 +08:00
@imn1

1. 主流用户
2. 高端用户 建立在主流之上满足用户
3. 低端用户 建立在主流以下满足用户

先满足主流
如果 低端/主流 用户想得到 主流/高端 的体验请升级

众口难调 某些用户喜欢在 低端位置 获取 高端体验 这样诉求只能是miss
imn1
2015-06-16 13:59:57 +08:00
@Septembers
这个就不用跟我说了,我全职做市场调查超过5年,非全职市场分析超过20年
skyler
2015-06-16 16:50:08 +08:00
看看 jstree 找找灵感吧 XD
br00k
2015-06-17 09:15:20 +08:00
一般都是后端干好吧。
mingzepeng
2015-06-17 09:56:13 +08:00
像js这种动态语言,生成树结构不要太方便啊
mingzepeng
2015-06-17 09:57:55 +08:00
看错楼主的表达了,不好意思。
coolicer
2015-06-17 14:12:54 +08:00
@czheo https://jsfiddle.net/6nk0mkm3/2/
我加多一层就报错了?
siroccoicode
2015-06-17 14:28:05 +08:00
@coolicer 你的用例中id、pid为字符串型,而作者代码判断条件使用===判断的数字型。作者代码中还有一个问题:如果原数组中id排序并非顺序,会出现parent在objMap取空的问题
coolicer
2015-06-17 14:36:22 +08:00
@siroccoicode 谢谢提醒
czheo
2015-06-17 18:55:07 +08:00
@siroccoicode objMap的bug都看出来了,你真仔细。不像某些lz拿来主义
coolicer
2015-06-17 22:15:22 +08:00
@czheo = = 我也有注意到全等,也是有转类型的,只是不知道为什么不行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/198927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX