前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组

前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组(洗牌算法)

1.数组转树

扁平数组转成树形结构(tree data)

也就是将

javascript 复制代码
const list = [
  { id: 1, name: '部门A', parentId: 0 },
  { id: 2, name: '部门B', parentId: 1 },
  { id: 3, name: '部门C', parentId: 1 },
  { id: 4, name: '部门D', parentId: 2 }
]

转化为

javascript 复制代码
[
  {
    id: 1,
    name: '部门A',
    parentId: 0,
    children: [
      {
        id: 2,
        name: '部门B',
        parentId: 1,
        children: [
          {
            id: 4,
            name: '部门D',
            parentId: 2,
            children: []
          }
        ]
      },
      {
        id: 3,
        name: '部门C',
        parentId: 1,
        children: []
      }
    ]
  }
]

思路:

创建一个 map 对象和 result 数组,map 数组建立映射 id 和内容的新映射,但是新映射中多了一个字段 children数组.创建一个 result 数组,作为最终的结果

遍历数据,如果 parentId=0,表示它是最外层的树,把它放入数组中,其他的内容放在对应 parentId 对应的 children 数组中.

javascript 复制代码
const list =[
    {id:1,name:'部门 A',parentId:0},
    {id:2,name:'部门 B',parentId:1},
    {id:3,name:'部门 C',parentId:1},
    {id:4,name:'部门 D',parentId:2}
];


function arrrytotree(list)
{
    let map={};
    let result=[];

    for(const item of list)
    {
        map[item.id]={
            ...item,
            children:[]
        };
    }

    for(const item of list)
    {
        const node=map[item.id];
        if(item.parentId===0) result.push(node);
        else
        {
            map[item.parentId].children.push(node);
        }
    }

    return result;
}

const result= arrrytotree(list);
console.log(JSON.stringify(result, null, 2));

2.数组扁平化-手动实现 flat()

数组扁平化到底是什么?

数组扁平化,就是把嵌套数组展开,变成层级更浅的数组,甚至变成一维数组。

复制代码
[1, [2, 3], [4, [5, 6]]]

变为

复制代码
[1, 2, 3, 4, 5, 6]

这就叫数组扁平化。

扁平化也分为扁平几层,如果是扁平一层的话:

复制代码
[1, 2, 3, 4, [5, 6]]

扁平两层

复制代码
[1, 2, 3, 4, 5, 6]

最简单的无限扁平化写法

javascript 复制代码
function myFlat(arr)
{
    const result =[];

    for(let item of arr)
    {
        if(Array.isArray(item)) result.push(...myFlat(item));
            else result.push(item);
    }
    return result;
}

如果要控制扁平的层数

javascript 复制代码
function myFlat(arr,depth=1)
{
    const result =[];

    for(let item of arr)
    {
        if(Array.isArray(item)&&depth>0) result.push(...myFlat(item,depth-1));
            else result.push(item);
    }
    return result;
}

3.如何随机打乱一个数组(math.random)

Fisher-Yates 洗牌算法:从数组最后一个元素开始,随机选一个 [0, i] 范围内的元素,和当前位置交换,然后继续向前处理。

每一轮确定一个位置

javascript 复制代码
const arr=[3,1,9,23,55,98];

function shuffle(arr)
{
    const result=[...arr];

    for(let i=arr.length-1;i>=0;i--)
    {
        const j= Math.floor(Math.random()*(i+1));
        [result[i],result[j]]=[result[j],result[i]]
    }
    return result;
}
console.log(shuffle(arr));
相关推荐
架构技术专栏8 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
别动我齐刘海8 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
志尊宝9 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
刘发财10 小时前
前端如何生成10000页PDF文件?
前端·javascript·开源
A接拉起00710 小时前
2026 年 JavaScript 开发者需要了解的知识
前端·javascript·后端
用户114818678948410 小时前
面试官:大屏项目里十几个模块同时渲染上万条数据,怎么做到不卡?
前端·性能优化
前端市界10 小时前
Pro React Admin: 统一工程底座,承载多种应用...
前端·github
葡萄城技术团队10 小时前
dsh-spreadjs-editor 当前支持什么:安装前需要了解的几件事
前端
三*一11 小时前
优化修整算法
前端·javascript·算法
weifont12 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化