把以下数据处理成这样的
// 源数据
var arr = [{
name: "河南",
url: "*",
child: [{
name: "濮阳",
url: "*",
child: [{
name: "南乐县",
url: "nale.html"
},
{
name: "清丰县",
url: "qingfeng"
}
]
},
{
name: "鹤壁",
url: "hebi.html"
},
]
},
{
name: "广东",
url: "*",
child: [{
name: "深圳",
url: "*",
child: [{
name: "宝安区",
url: "baoan"
},
{
name: "南山区",
url: "nanshan.html"
}
]
},
{
name: "广州",
url: "guangzhou"
},
{
name: "佛山",
url: "foshna.html"
}
]
},
]
要处理成这样的
var arr = [{
name: "河南",
url: "*",
child: [{
name: "濮阳",
url: "*",
child: [{
name: "南乐县",
url: "nale.html"
},
]
},
{
name: "鹤壁",
url: "hebi.html"
},
]
},
{
name: "广东",
url: "*",
child: [{
name: "深圳",
url: "*",
child: [
{
name: "南山区",
url: "nanshan.html"
}
]
},
{
name: "佛山",
url: "foshna.html"
}
]
},
]
要求只要以.html结尾的,但保持数据结构不变。我可以想到用endsWith()
像这种可以直接使用递归进行遍历修改
// 源数据
var arr = [{
name: "河南",
url: "*",
child: [{
name: "濮阳",
url: "*",
child: [{
name: "南乐县",
url: "nale.html"
},
{
name: "清丰县",
url: "qingfeng"
}
]
},
{
name: "鹤壁",
url: "hebi.html"
},
]
},
{
name: "广东",
url: "*",
child: [{
name: "深圳",
url: "*",
child: [{
name: "宝安区",
url: "baoan"
},
{
name: "南山区",
url: "nanshan.html"
}
]
},
{
name: "广州",
url: "guangzhou"
},
{
name: "佛山",
url: "foshna.html"
}
]
},
];
let a=arrayTreeFilter(arr, filterFn, ".html");
console.log(a)
function arrayTreeFilter(data, predicate, filterText) {
const nodes = data;
// 如果已经没有节点了,结束递归
if (!(nodes && nodes.length)) {
return;
}
const newChildren = [];
for (const node of nodes) {
if (predicate(node, filterText)) {
// 如果自己(节点)符合条件,直接加入到新的节点集
newChildren.push(node);
// 并接着处理其 children,(因为父节点符合,子节点一定要在,所以这一步就不递归了)
node.child = arrayTreeFilter(node.child, predicate, filterText);
} else {
// 如果自己不符合条件,需要根据子集来判断它是否将其加入新节点集
// 根据递归调用 arrayTreeFilter() 的返回值来判断
const subs = arrayTreeFilter(node.child, predicate, filterText);
// 以下两个条件任何一个成立,当前节点都应该加入到新子节点集中
// 1. 子孙节点中存在符合条件的,即 subs 数组中有值
// 2. 自己本身符合条件
if ((subs && subs.length) || predicate(node, filterText)) {
node.child = subs;
newChildren.push(node);
}
}
}
return newChildren;
}
function filterFn(data, filterText) { //过滤函数
if (!filterText) {
return true;
}
return (
new RegExp(filterText, "i").test(data.url) //我是一title过滤 ,你可以根据自己需求改动
);
}
我这个是递归循环出来的。嵌套很多层页可以处理。如果数据只是 两层 不用这么麻烦