菜单路径url是哪个字段?
路径可以先空着,
layout字段,数据库中还没填值
@流沙°:
<script type="text/javascript"> var result = []; result.push({ id: 'YN01', name: '菜单A', parentid: 'YN', location: '' }); result.push({ id: 'YN0101', name: '菜单A1', parentid: 'YN01', location: '' }); result.push({ id: 'YN0102', name: '菜单A2', parentid: 'YN01', location: '../menua.html' }); result.push({ id: 'YN010201', name: '菜单A11', parentid: 'YN0101', location: '../menua.html' }); var navigates = "["; function buildMenu(nodes) { var gc = function (parentid) { var cn = []; for (var i = 0; i < nodes.length; i++) { var n = nodes[i]; var n2 = {}; if (n.parentid === parentid) { n2.text = n.name; n2.url = n.location; n2.children = gc(n.id); cn.push(n2); } } return cn; } return gc('YN'); } var newnodes = buildMenu(result); var str = JSON.stringify(newnodes); str = str.replace(/{"text":/g, "").replace(/"url":""/g, "").replace(/"url":/g, "").replace(/,"children":\[\]}/g, "").replace(/,"children":/g, "").replace(/}/g, ""); var navigate = JSON.parse(str); alert(navigate); console.log(navigate); </script>
@流沙°: 用递归来构建树数组,以贴出代码。
@JackWang-CUMT:
复制你的
@流沙°: 初始数据你要改的,return gc('YN')改成模块的最顶级ID
@JackWang-CUMT: 要是最顶级id数据不止一个呢?
@流沙°: 另外你的parent_id,我的是parentid,你要把字段修改成你的
@JackWang-CUMT:
@流沙°: 那也可以,如果多个顶级,那么parent_id一般为空,直接写成return gc('')
@JackWang-CUMT:
还是没数据,看看我改的对不对
@流沙°:
1 function buildMenu(nodes) { 2 var gc = function (parentid) { 3 var cn = []; 4 for (var i = 0; i < nodes.length; i++) { 5 var n = nodes[i]; 6 var n2 = {}; 7 if (n.parentId === parentid) { 8 n2.text = n.name; 9 n2.url = n.location; 10 n2.children = gc(n.id); 11 cn.push(n2); 12 } 13 } 14 return cn; 15 } 16 return gc(''); 17 } 18 var newnodes = buildMenu(result); 19 var str = JSON.stringify(newnodes); 20 21 str = str.replace(/{"text":/g, "").replace(/"url":""/g, "").replace(/"url":/g, "").replace(/,"children":\[\]}/g, "").replace(/,"children":/g, "").replace(/}/g, ""); 22 23 24 var navigate = JSON.parse(str); 25 alert(navigate); 26 console.log(navigate);
@JackWang-CUMT:
@流沙°: 加我QQ 308106637
@流沙°:
function buildMenu(nodes) {
var gc = function (parentid) {
var cn = [];
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i];
var n2 = {};
if (n.parentId === parentid) {
n2.text = n.name;
n2.url = n.location;
n2.children = gc(n.id);
cn.push(n2);
}
}
return cn;
}
return gc('');
}
var newnodes = buildMenu(result);
var str = JSON.stringify(newnodes);
//console.log(str);
console.log(str);
str = str.replace(/"text":/g, "").replace(/"url":""/g, "").replace(/"url":/g, "").replace(/,"children":\[{/g, "[").replace(/,"children":\[\]/g, "]").replace(/}/g, "").replace(/{/g, "[");
//str = "[" + str + "]";
console.log(str);
var navigate = JSON.parse(str);
alert(navigate);
console.log(navigate);
为什么一定要在js处理,你可以看成两张表join,返回一个对象集合,属性是父节点name,对于子节点的的对象集合
要求必须要用js处理啊
把你数据库里的菜单数据查出来然后转换为Json数据补充上去先。不用全部,一部分即可。但是得有关联。才能给你继续。给点初始数据别人好帮忙嘛!
你现在result[0]里面的数据是第一根节点及其子节点数据吗
建议你把result的json数据发出来,用递归处理比你写判断好
@小小高: 但是这个是根据权限取的数据,并没有取所有的,这样可以吗?
@流沙°: 我说的是树的层级,只能有3级吗
@小小高: 对的,就跟图一一样
为什么要拼?
这个数组就是乱搞的吧。
按你这个定义,最接近的结果定义:
一个多层数组,每个数组的0号位置是一个字符串(标题),1-N是n-1个下层数组。
大体这个样子,不过我不知道你最后一级如何区分是属性(url),还是更下一级的菜单,先这样吧。
[ [ "menu-1", ["sub-menu-1-1", ...], ["sub-menu-1-2", ...]...]
[ "menu-2", ["sub-menu-2-1", ...], ["sub-menu-2-1", ...]...]
...
]
而原始结构是
database = [{ "menu-1", parent: 0, id: "YN-1"}
{"sub-menu-1-1", parent: "YN-1", id: "YN-1-1" ...}
{"sub-menu-1-2", parent: "YN-1", id: "YN-1-2", ...}
...
]
让子结点快速找到父结点,需要一个Hash表, 注意top那个空数组,用来放顶级节点。
hash = {"top": [],
"YN-1" : [ "menu-1",],
"YN-1-1": ["sub-menu-1-1", ...]
"YN-1-2": ["sub-menu-1-2", ...]
}
希望可以把子节点添加到父节点上后面,包括顶级节点,放到top对应的数组中。
top就是最后需要的数组。
代码如下
var mkMenu; mkMenu = function(database) { var h = {YN: [] }; database.forEach(function(item) { return h[item.id] = [item.name]; }); database.forEach(function(item) { return h[item.parent_id].push(h[item.id]); }); return h['YN']; };