算法

算法

# 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)

最新数组方法

最新数组方法

管理上的问题

管理上的问题