使用递归能够减少很多的for循环的使用,其数据格式如下:
var data = [{
name: "所有物品",
children: [
{
name: "水果",
children: [{name: "苹果", children: [{name: '青苹果'}, {name: '红苹果'}]}]
},
{
name: '主食',
children: [
{name: "米饭", children: [{name: '北方米饭'}, {name: '南方米饭'}]}
]
},
{
name: '生活用品',
children: [
{name: "电脑类", children: [{name: '联想电脑'}, {name: '苹果电脑'}]},
{name: "工具类", children: [{name: "锄头"}, {name: "锤子"}]},
{name: "生活用品", children: [{name: "洗发水"}, {name: "沐浴露"}]}
]
}
]
}]
有时候后台不会处理数据,需要我们前段自己去处理。其最终结果如下:
青苹果;红苹果;北方米饭;南方米饭;联想电脑;苹果电脑;锄头;锤子;洗发水;沐浴露;
- 在不适应递归的情况下是这样实现的。
var resolFunc=function(){
var str='';
data.forEach(function(row){
row.children.forEach(function(row){
row.children.forEach(function(row){
row.children.forEach(function(row){
str+=(row.name+';')
})
})
})
})
return str;
}
console.log(resolFunc())
- 使用递归则大大减少了for循环的冗余,而且看起来更简便也好理解。
//递归实现
var reserveFunc = function() {
var str = ''; //设置空字段
const func = function(list) {
list.forEach(function(row) {
if(row.children) {
func(row.children)
} else {
console.log(str)
str += row.name + ';'
}
})
}
func(data)
console.log(str)
}
reserveFunc();
其他
/**
** @param array: 对象数组
** @param groupParam: 对象数组中对象的键名
** @return result:按键名分组过的对象数组
*/
function arrayGroupBy(array, groupParam) {
const arr = array;
const groupedArr = arr.reduce((pre, item) => {
const groupName = item[groupParam];
console.log(groupName,pre,item)
pre[groupName] = [...pre[groupName] || [], item];
return pre;
}, {});
console.log(groupedArr)
const result = Object.keys(groupedArr).map(key=>{
const obj = {
name: key,
value: groupedArr[key]
};
return obj;
});
return result;
}
// demo
const arr = [
{name: '王二', age: 18, role: '销售'},
{name: '张三', age: 20, role: '店长'},
{name: '李四', age: 18, role: '经理'},
{name: '许五', age: 24, role: '店长'},
{name: '六六', age: 23, role: '销售'},
];
const result = arrayGroupBy(arr, 'role');
console.log(result)
总之,forEach的遍历的方式能实现多级的遍历,并且数据格式可以灵活一些,但是遍历的层级有限,而且对于未知层级的情况下,就很难下手了。
而递归遍历,只要内存够用,你能实现任意层级的遍历,但缺点也很明显,每一个层级里面需要有固定的数据格式,否则无法遍历