算法题分享之数组转树

65 阅读1分钟

描述

用js将下列数组转为树:

const arr = [
    {
        "id": 1,
        "pid": 0,
        "label": "label1"
    },
    {
        "id": 2,
        "pid": 1,
        "label": "label2"
    },
    {
        "id": 3,
        "pid": 2,
        "label": "label3"
    },
    {
        "id": 4,
        "pid": 1,
        "label": "label4"
    },
    {
        "id": 5,
        "pid": 2,
        "label": "label5"
    },
    {
        "id": 6,
        "pid": 4,
        "label": "label6"
    },
    {
        "id": 7,
        "pid": 2,
        "label": "label7"
    },
    {
        "id": 8,
        "pid": 3,
        "label": "label8"
    }
]

直接上代码吧:

function array2tree(arr, id, pid) {
    const obj = {};
    const result = [];
    // 取数组id为对象key
    for (let i = 0; i < arr.length; i++) {
        obj[arr[i][id]] = arr[i];
    }
    for (let k = 0; k < arr.length; k++) {
        if (obj[arr[k][pid]]) {
            if (!obj[arr[k][pid]].children) {
                obj[arr[k][pid]].children = [arr[k]];
            } else {
                obj[arr[k][pid]].children.push(arr[k]);
            }
        } else {
            result.push(obj[arr[k][id]]);
        }
    }
    return result;
}

array2tree(arr, 'id', 'pid');

输出结果:

[{
	"id": 1,
	"pid": 0,
	"label": "label1",
	"children": [{
		"id": 2,
		"pid": 1,
		"label": "label2",
		"children": [{
			"id": 3,
			"pid": 2,
			"label": "label3",
			"children": [{
				"id": 8,
				"pid": 3,
				"label": "label8"
			}]
		}, {
			"id": 5,
			"pid": 2,
			"label": "label5"
		}, {
			"id": 7,
			"pid": 2,
			"label": "label7"
		}]
	}, {
		"id": 4,
		"pid": 1,
		"label": "label4",
		"children": [{
			"id": 6,
			"pid": 4,
			"label": "label6"
		}]
	}]
}]