js和go的列表转树形, 执行速度测试对比

js代码,浏览器上运行

// 列表转树形
export function deepTree(list: any[]): any[] {
	const newList: any[] = [];
	const map: any = {};
	for (let index = 0; index < list.length; index++) {
		const e = list[index];
		map[e.id] = e;
	}

	for (let index = 0; index < list.length; index++) {
		const e = list[index];
		const parent = map[e.parentId];

		if (parent) {
			(parent.children || (parent.children = [])).push(e);
		} else {
			newList.push(e);
		}
	}
	return newList;
	 
}

// 递归遍历
export const deepTree2 = (arr: any[], parentId: any) => {
	function loop(parentId: any) {
		return arr.reduce((pre, cur) => {
			if (cur.parentId == parentId) {
				cur.children = loop(cur.id);
				pre.push(cur);
			}
			return pre;
		}, []);
	}

	return loop(parentId);
};

// 遍历树
export const deepTree3 = (arr: any[]) => {
	// 利用两层filter实现
	let newList = arr.filter((item) => {
		item.children = arr.filter((e) => {
			return item.id === e.parentId;
		});
		return !item.parentId;
	});
	return newList;
};

// 树形转列表
export function revDeepTree(list: any[]) {
	const arr: any[] = [];
	let id = 0;

	function deep(list: any[], parentId: number) {
		list.forEach((e) => {
			if (!e.id) {
				e.id = id++;
			}

			if (!e.parentId) {
				e.parentId = parentId;
			}

			arr.push(e);

			if (e.children && isArray(e.children)) {
				deep(e.children, e.id);
			}
		});
	}

	deep(list || [], 0);

	return arr;
}

测试运行

//生成随机的菜单列表数据,给转换树形菜单使用
function generateMenuList(
	depth: number = 1,
	menuList: { id: number; parentId: number | null }[] = [],
	maxDepth: number = 5
): { id: number; parentId: number | null }[] {
	// 如果菜单列表长度达到1000,则停止生成
	if (menuList.length >= 10000) {
		return menuList;
	}

	// 如果当前深度超过了最大深度,则停止递归
	if (depth > maxDepth) {
		return menuList;
	}
	// 生成一个随机的id
	let id = depth;

	// 如果菜单列表不为空,则随机选择一个已存在的id作为parentId;否则parentId为null
	let parentId: number | null = null;
	if (menuList.length > 0) {
		parentId = menuList[Math.floor(Math.random() * menuList.length)].id;
	}

	// 将新菜单项添加到列表中
	menuList.push({ id, parentId });

	// 递归调用生成子菜单项,深度加1
	return generateMenuList(depth + 1, menuList, maxDepth);
}

// 生成菜单列表
const menuList = generateMenuList(1, [], 4000);

// 输出生成的菜单列表
console.log(menuList);

console.time("deepTree");
const l = deepTree(menuList);
console.log("l 引用类型", l);
console.timeEnd("deepTree");

console.time("deepTree2");
const l2 = deepTree2(menuList, null);
console.log("l2 递归", l2);
console.timeEnd("deepTree2");

console.time("deepTree3");
const l3 = deepTree3(menuList);
console.log("l3 filter循环", l3);
console.timeEnd("deepTree3");

执行结果
在这里插入图片描述

go代码,编辑器运行


// 遍历树
func DeepTree(strSlice []*TreeNode) interface{} {
	var (
		strMap  = make(map[string]*TreeNode)
		newList []*TreeNode
	)

	for i := range strSlice {
		node := strSlice[i]
		strMap[node.ID] = node
	}
	for i := range strSlice {
		node := strSlice[i]
		if node.ParentId != "" {
			strMap[node.ParentId].Children = append(strMap[node.ParentId].Children, node)
		} else {
			newList = append(newList, node)
		}
	}
	return newList
}

// 递归遍历树
func DeepTree2(strSlice []*TreeNode) interface{} {

	newList := loop(strSlice, "")
	return newList
}

func loop(strSlice []*TreeNode, parentId string) []*TreeNode {
	var newList []*TreeNode
	for i := range strSlice {
		if strSlice[i].ParentId == parentId {
			strSlice[i].Children = loop(strSlice, strSlice[i].ID)
			newList = append(newList, strSlice[i])
		}
	}
	return newList
}

测试运行

func Test(t *testing.T) {

	var (
		menuSlice []*MenuItem
		strSlice  []*TreeNode
	)
	menuSlice = generateMenu(1, menuSlice, 4000)

	str := gjson.MustEncodeString(menuSlice)
	gconv.Scan(str, strSlice)

	startTime1 := time.Now()
	DeepTree(strSlice)
	endTime1 := time.Now()
	g.Log().Debugf(ctx, "4000条 引用类型 时间:%v", endTime1.Sub(startTime1))

	startTime2 := time.Now()
	DeepTree2(strSlice)
	endTime2 := time.Now()
	g.Log().Debugf(ctx, "4000条 递归 时间:%v", endTime2.Sub(startTime2))

}

运行结果
在这里插入图片描述

最终结果:
js的第一种写法执行最快,用时 0.598876953125毫秒是 598.88 微秒
go的第一种写法执行最快,用时 83 微妙

个人测试,有错误的欢迎留言指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Android】系统启动流程分析 —— init 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程&#xff0c;准确的说&#xff0c;它是 Linux 系统中用户控制的第一个进程&#xff0c;它的进程号为 1&#xff0c;它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…

第四讲 Buffer Pool

问题&#xff1a;DBMS 是如何管理其内存和磁盘之间来回移动数据的&#xff1f; 答案&#xff1a;在决定如何在磁盘中来回移动数据时&#xff0c;我们必须考虑两个关键方面&#xff1a; 空间控制【Spatial Control】&#xff1a; 将页【pages】写在在磁盘的什么地方&#xff…

线性表:关于链表(主要以单链表为例)的相关理解和应用

多清澈这天空 晴雨相拥 同心逐梦&#xff01; 坚守我信心 一路出众&#xff01;&#xff01; 首先&#xff0c;按照惯例&#xff0c;欢迎大家边听歌边观看本博客 ▶ 紫荆花盛开 (163.com)&#xff08;建议复制链接&#xff0c;浏览器打开&#xff0c;csdn打开太慢了&#x…

吉时利keithley 2604B数字源表

181/2461/8938产品概述&#xff1a; Keithley 2604B 源表可让您比以前更快、更轻松、更经济地进行精密直流、脉冲和低频交流源测量测试。Keithley 2604B 的 IV 功能测试测试速度是竞争产品的两到四倍&#xff0c;其结合了&#xff1a; Keithley 的高速第三代源测量单元 (SMU)…

Linux学习-进程

目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例&#xff1a;创建九个子进程 目录 进程基本概念 进程相关命令 进程的创建 进程的调度 进程相关函数接口 进程的消亡 实例&#xff1a;创建九个子进程 exec函数…

Typecho博客后台登陆界面美化

登录界面&#xff1a; 食用方法&#xff1a; 备份 admin 目录 压缩包内容上传到 admin 目录内。 结构:网站根目录 /admin/login.php 结构:网站根目录 /admin/style 修改 login.php 第35行&#xff0c;把“季春二九管理后台”替换成自己的信息 清理缓存&#xff0c;开始体验新的…

罐头鱼AI矩阵获客批量混剪运营系统介绍

罐头鱼AI矩阵——智能运营系统助力抖音视频创作 随着社交媒体的普及&#xff0c;视频内容创作成为了企业营销的重要手段。为了帮助您更高效地进行视频内容创作和发布&#xff0c;我们推出了罐头鱼AI矩阵&#xff0c;一款集智能混剪、关键词生成、发布管理等功能于一体的全新运营…

交易的成功并非仅依赖于拥有强大的工具,而在于如何用好你的工具

任何领域伟大的成就往往源于个人不屈不挠地克服重重障碍的能力&#xff0c;这种毅力和决心并非普通人所具备&#xff0c;因此他们往往只能停留在普通和平凡的层面。 而对于那些渴望在交易领域取得卓越成就的人来说&#xff0c;坚持采用一套经过验证且有效的交易系统&#xff0c…

ArtDD 一键下载 掘金、CSDN、开源中国、博客园文章 文章的Chrome 插件

有想一键下载博客园、掘金、CSDN、开源中国等博客自己的文章到本地的可以使用这个插件 插件会根据当前页面链接自动分辨出文章所属平台&#xff0c;可能有些文章详情链接是不支持的&#xff0c;例如博客园存在很多个版本的文章详情页链接格式&#xff0c;想要支持所有的链接是…

设计模式之抽象工厂模式解析

抽象工厂模式 1&#xff09;问题 工厂方法模式中的每个工厂只生产一类产品&#xff0c;会导致系统中存在大量的工厂类&#xff0c;增加系统的开销。 2&#xff09;概述 a&#xff09;产品族 和 产品等级结构 产品等级结构&#xff1a;产品的继承结构&#xff1b; 产品族&…

武汉星起航引领跨境电商新潮流,一站式孵化平台助力合作伙伴腾飞

在全球经济一体化的大趋势下&#xff0c;跨境电商以其独特的优势逐渐成为连接各国市场的桥梁。随着市场竞争的加剧&#xff0c;传统的经营模式已难以满足日益复杂的业务需求&#xff0c;合作伙伴迫切需要更为全面、专业的指导和支持。正是在这样的背景下&#xff0c;武汉星起航…

罐头鱼AI矩阵运营系统|视频批量混剪|矩阵获客

罐头鱼AI传单功能操作说明 个性化首页展示 登录状态一目了然灵活绑定账号数量快速查看最新上传视频素材和素材列表 抖音账号轻松绑定 明晰显示登录账号和已绑定账号灵活控制可绑定账号数量一键授权绑定抖音账号 账号管理列表 清晰管理查看绑定抖音账户列表 上传视频素材便捷管理…

洛谷_P2678 [NOIP2015 提高组] 跳石头_python写法

P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) d, n, m map(int,input().split())data [0] for i in range(n):value int(input())data.append(value) data.append(d)def check(mid):now 0cnt 0for i in range(1,n2):if abs(data[now]-da…

Excel的数据分析工具

Excel的数据分析工具 会生成新的工作簿 全选--数据透视表 插入切片器 使用作图工具 可以继续插入条件切片

CodeMeter案例分享-工业自动化领域

德国威步遵行于“完美保护、完美授权、完美安全”的企业宗旨&#xff0c;为各个领域的软件商、设备商的数字资产提供强有力的保护&#xff0c;有效防止软件盗版、逆向工程、代码篡改、恶意破坏以及商业间谍活动&#xff0c;帮助企业把全新的商业模式与业务流程完美整合并获得可…

桌面日程安排软件,笔记本电脑常用软件有哪些?

在如今快节奏的社会环境中&#xff0c;时间仿佛成了比金子还要珍贵的资源。我们每个人都像是一名指挥官&#xff0c;需调度好每一刻光阴&#xff0c;使其发挥最大效益。而在这场与时间的较量中&#xff0c;一款优秀的桌面日程安排软件就像您的私人助理&#xff0c;帮您精准规划…

武汉星起航引领跨境电商新潮流,深耕亚马逊打造全方位合作新模式

在全球化的浪潮下&#xff0c;跨境电商已成为连接各国市场的重要桥梁&#xff0c;为无数企业带来了前所未有的发展机遇。在这一领域&#xff0c;武汉星起航电子商务有限公司以其独特的战略眼光和实战经验&#xff0c;成为引领行业发展的佼佼者。公司自2017年起便深耕亚马逊平台…

应用案例 | 基于三维机器视觉的销轴销套深框抓取上料解决方案

随着科技的不断发展&#xff0c;机器人技术不断革新&#xff0c;并逐渐渗透到各行业的各个环节。在机器人技术的帮助下&#xff0c;各行业的生产力不断增强&#xff0c;生产效率也得到了极大的提高。 销轴销套深框抓取是指在机械装配或生产过程中&#xff0c;对销轴和销套进行抓…

【数据可视化】Echarts官方文档及常用组件

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. Echarts官方文档介绍3. ECharts基础架构及常用术语3.1 ECharts的基础架构3.2 ECharts的常用术语3.2.1 ECharts的基本名词3.2.2 ECharts的图表名词 4. 直角坐标系下的网格及坐标轴4.1 直角坐标系下的网格4.2…

今日问题:动态分配内存出错

2024.3.22 在搜素了许多文章和查阅了许多博客后依然没有找到问题所在&#xff0c;最后无意之间翻看以前的关于动态内存管理的代码后发现&#xff1a; 没加头文件&#xff1a;#include<stdlib.h> 苦笑不得了属于是 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio…