zoukankan      html  css  js  c++  java
  • js数据处理-复杂树构建

    规则

    规则
    subject_no以小数点为段,每一段数字进行匹配,如:x包含x.y,x.z
    未能精确匹配的, x包含x.y.z,x.n.m
    未能精确匹配的, x.y包含x.y.z,x.a.b.c.d

    初始数据

    var no_list = [
            {
                subject_no: '10.3',
            },
            {
                subject_no: '10',
            },
            {
                subject_no: '10.3.1',
            },
            {
                subject_no: '10.4.3.1',
            },
            {
                subject_no: '10.3.2',
            },
            {
                subject_no: '10.4.3',
            },
            {
                subject_no: '10.3.2.1.1',
            },
            {
                subject_no: '10.4.3.2.1',
            },
            {
                subject_no: '10.4.3.2.1.2',
            },
            {
                subject_no: '10.4.3.2.1.0',
            },
            {
                subject_no: '10.4.3.2.1.0.5.6',
            }
        ]
    

    需要处理成的结果数据

    var result_tree = [
        {
            subject_no: '10',
            children: [
                {
                    subject_no: '10.3',
                    children: [
                        {
                            subject_no: '10.3.1',
                        },
                        {
                            subject_no: '10.3.2',
                            children: [
                                {
                                    subject_no: '10.3.2.1.1',
                                },
                            ]
                        },
                    ]
                },
                {
                    subject_no: '10.4.3',
                    children: [
                        {
                            subject_no: '10.4.3.1',
                            children: [
                                {
                                    subject_no: '10.4.3.2.1',
                                    children: [
                                        {
                                            subject_no: '10.4.3.2.1.0',
                                            children: [
                                                {
                                                    subject_no: '10.4.3.2.1.0.5.6',
                                                }
                                            ]
                                        },
                                        {
                                            subject_no: '10.4.3.2.1.2',
                                        },
                                    ]
                                },
                            ]
                        },
                    ]
                },
            ]
        },
    ]
    

    算法实现

    function list2tree(list) {
        // 初始化匹配map
        let map = list.reduce((m, i) => {
            m[i.subject_no] = i
            return m
        }, {})
        let tree = []
        for (let i = 0; i < list.length; i++) {
            let pathArr = list[i].subject_no.split('.')
            //-1的目的是为了避免后面匹配到自己,否则会陷入死循环
            let j = pathArr.length - 1;
            // 遍历路径数组
            for (; j > 0; j--) {
                // 从后往前取,直到map中有数据
                let path = pathArr.slice(0, j).join('.')
                // 有数据就放入children
                if (map[path]) {
                    if (!map[path].children) {
                        map[path].children = []
                    }
                    map[path].children.push(list[i])
                    break
                }
            }
            j === 0 && tree.push(list[i])
        }
        return tree
    }
    console.log(list2tree(no_list))


    https://web03.cn/blog/249

    踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。
  • 相关阅读:
    你真的懂@ResponseBody和@RequestBody吗?
    Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp
    hihocoder #1032 : 最长回文子串 Manacher算法
    CSU 1808: 地铁 最短路
    UVALive 6912 Prime Switch 暴力枚举+贪心
    Codeforces Beta Round #9 (Div. 2 Only) D. How many trees? dp
    UVALive 6913 I Want That Cake 博弈+dp
    UVALive
    Codeforces Round #245 (Div. 1) B. Working out dp
    HDU 5834 Magic boy Bi Luo with his excited tree 树形dp
  • 原文地址:https://www.cnblogs.com/xiaofeilin/p/14790140.html
Copyright © 2011-2022 走看看