算法
/
算法
# 1. list 转树形结构
思路:遍历 list,当 parentId 不为 0 的时候,把这个菜单挂到父菜单下面。利用对象地址映射的原理,将所有菜单都挂一遍,子孙菜单会自动挂上。最后只保留第一级
let list = [
{ id: 1, name: '部门A', parentId: 0 },
{ id: 2, name: '部门B', parentId: 0 },
{ id: 3, name: '部门C', parentId: 1 },
{ id: 4, name: '部门D', parentId: 1 },
{ id: 5, name: '部门E', parentId: 2 },
{ id: 6, name: '部门F', parentId: 3 },
{ id: 8, name: '部门H', parentId: 7 }
{ id: 7, name: '部门G', parentId: 2 },
]
function convert(list){
list.map(item=>{
//第一级菜单没有父菜单,所以略过
if(item.parentId !==0){
//找出当前菜单的父菜单
let parent = list.find(v=> v.id == item.parentId)
//把当前菜单挂到父菜单上 如果当前菜单有子菜单,会一起带过去
parent.children ? parent.children.push(item):parent.children = [item]
}
})
//最后把数组的第一层菜单提出来
return list.filter(item => item.parentId ===0)
}
console.log(convert(list))
# 2. 树转 list
function ListData(data, pid) {
return data.reduce(
(arr, item) =>
arr.concat([item], ListData(item.children, item.id)),
[]
)
}
var newList = ListData(tree, 'root')
console.log(newList)
# 3.数组去重
1.最简单
[...new Set(arr)] //去除不了空对象
3.利用indexOf去重 新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当
前元素,如果有相同的值则跳过,不相同则push进数组
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var array = [];
for (var i = 0; i < arr.length; i++) {
if (array .indexOf(arr[i]) === -1) {
array .push(arr[i])
}
}
return array;
}
4.利用filter
function unique(arr) {
return arr.filter(function(item, index, arr) {
//当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
return arr.indexOf(item, 0) === index;
});
}
5.数组对象去重
unique(arr) {
const map = new Map();
//新建一个map,然后开始筛选,判断res里有没有当前item的id,如果有,就返回且把ID放进map,如果没有就过
return arr.filter((arr) => !map.has(arr.id) && map.set(arr.id, 1))
}
# 二维数组传一维数组
Array.prototype.concat.apply([], arr)