JavaScript树结构和一维数组互转

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			var source = [{
				id: 1,
				pid: 0,
				name: '江苏省'
			}, {
				id: 2,
				pid: 1,
				name: '南京市'
			}, {
				id: 7,
				pid: 0,
				name: '上海市'
			}, {
				id: 3,
				pid: 2,
				name: '鼓楼区'
			}, {
				id: 6,
				pid: 5,
				name: '武汉市'
			}, {
				id: 4,
				pid: 2,
				name: '玄武区'
			}, {
				id: 5,
				pid: 0,
				name: '湖北省'
			}]

			function toTree(data) {
				let result = [];
				if (!Array.isArray(data)) {
					return result;
				}
				data.forEach(item => {
					delete item.children;
				});
				let map = {};
				data.forEach(item => {
					map[item.id] = item; // id为键,原数据每一项为值的map对象
				});
				data.forEach(item => {
					let parent = map[item.pid]; // item的pid若与map对象的键相同,则item为父级节点
					let label = "";
					item.label = item.name;
					if (parent) {
						(parent.children || (parent.children = [])).push(item);
						parent.children.forEach(_item => {
							_item.label = _item.name;
						});
					} else {
						result.push(item);
					}
				});
				console.log(result)
				return result;
			}
			let treearr = toTree(source);
			// 树形数据转为一维数组
			function getOneArr(arr) {
				let data = JSON.parse(JSON.stringify(arr)) // 此处应该换成loadsh的cloneDeep
				let newData = []
				const callback = (item) => {
					(item.children || (item.children = [])).map(v => {
						callback(v)
					})
					delete item.children
					newData.push(item)
				}
				data.map(v => callback(v))
				return newData
			}
			console.log(getOneArr(treearr))

               //树结构转换一维数组
let data = [
    {
		name:1,
		sex:0,
		children:[
			{
				name:3
			},
			{
				name:4,
				children:[
					{
						name:3
					},
					{
						name:4
					}
				]
			}
		]
	},
	{
		name:2
	}	
]
function toOneList(){
    //承载数据
    let newData = []
    //递归方法
    function getData(data){
	    data.forEach(item=>{
		    if(item.children){
			    getData(item.children)
			    delete item.children
			    newData.push(item)
		    }else{
			    newData.push(item)
		    }
	        })
        }
        getData(data)
    }

		</script>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值