【study】数组层级处理

69 阅读2分钟
将testList转成levelList
        const levelList = [
            {
                value: '10000',
                label: '商品营销',
                disabled: false,
                children: [
                    {
                        value: '1',
                        label: 'S',
                        disabled: false,
                        children: [],
                    },
                    {
                        value: '2',
                        label: 'A',
                        disabled: false,
                        children: [],
                    },
                    {
                        value: '3',
                        label: 'B',
                        disabled: false,
                        children: [],
                    },
                    {
                        value: '4',
                        label: 'C',
                        disabled: false,
                        children: [],
                    },
                ],
            },
            {
                value: '20000',
                label: '用户营销',
                disabled: false,
                children: [
                    {
                        value: '20100',
                        label: 'cross',
                        disabled: false,
                        children: [
                            {
                                value: '20101',
                                label: 'cross',
                                disabled: false,
                                children: [],
                            },
                            {
                                value: '20102',
                                label: 'cross',
                                disabled: false,
                                children: [],
                            },
                        ],
                    },
                ],
            },
        ];
        
 
 const testList = [
            {
                calendarLabelKey: 10000,
                bizLabelName: '商品营销',
                bizLabelKey: '商品营销',
                valid: true,
                child: [
                    {
                        calendarLabelKey: 1,
                        bizLabelName: 'S',
                        bizLabelKey: 'S',
                        valid: false,
                        child: [],
                    },
                    {
                        calendarLabelKey: 2,
                        bizLabelName: 'A',
                        bizLabelKey: 'A',
                        valid: true,
                        child: [],
                    },
                    {
                        calendarLabelKey: 3,
                        bizLabelName: 'B',
                        bizLabelKey: 'B',
                        valid: true,
                        child: [],
                    },
                    {
                        calendarLabelKey: 4,
                        bizLabelName: 'C',
                        bizLabelKey: 'C',
                        valid: true,
                        child: [],
                    },
                ],
            },
            {
                calendarLabelKey: 20000,
                bizLabelName: '用户营销',
                bizLabelKey: '用户营销',
                valid: true,
                child: [
                    {
                        calendarLabelKey: 20100,
                        bizLabelName: 'Cross券',
                        bizLabelKey: 'cross',
                        valid: true,
                        child: [
                            {
                                calendarLabelKey: 20101,
                                bizLabelName: '新客券',
                                bizLabelKey: 'cross',
                                valid: true,
                                child: [],
                            },
                            {
                                calendarLabelKey: 20102,
                                bizLabelName: '老客券',
                                bizLabelKey: 'cross',
                                valid: true,
                                child: [],
                            },
                        ],
                    },
                ],
            },
        ];
        
 
     function convertList(list) {
            return list.map(item => {
                const { calendarLabelKey, bizLabelName, child , valid} = item;
                return {
                    value: String(calendarLabelKey),
                    label: bizLabelName,
                    disabled: !valid,
                    children: child.length > 0 ? convertList(child) : [],
                };
            });
        }

        const aaa = convertList(testList); // 将testList转成levelList
        console.log(aaa);

反查

  const levelList = [
            {
                value: '10000',
                label: '商品营销',
                disabled: false,
                children: [
                    {
                        value: '1',
                        label: 'S',
                        disabled: false,
                        children: [],
                    },
                    {
                        value: '2',
                        label: 'A',
                        disabled: false,
                        children: [],
                    },
                    {
                        value: '3',
                        label: 'B',
                        disabled: false,
                        children: [],
                    },
                    {
                        value: '4',
                        label: 'C',
                        disabled: false,
                        children: [],
                    },
                ],
            },
            {
                value: '20000',
                label: '用户营销',
                disabled: false,
                children: [
                    {
                        value: '20100',
                        label: 'cross',
                        disabled: false,
                        children: [
                            {
                                value: '20101',
                                label: 'cross',
                                disabled: false,
                                children: [],
                            },
                            {
                                value: '20102',
                                label: 'cross',
                                disabled: false,
                                children: [],
                            },
                        ],
                    },
                ],
            },
        ];

        const level1Id = 20101
        const level2Id = 2


  // 递归方案
        function findPath1(tree, value, path = []) {
            for (let node of tree) {
                console.log(node, 'node');
                if (node.value === value) {
                    path.push(node.value);
                    return path;
                }
                if (node.children) {
                    const nextPath = [...path, node.value];
                    const result = findPath1(node.children, value, nextPath); // 递归
                    if (result.length) return result;
                }
            }
            return [];
        }

        // 回溯方案
        function findPath2(tree, value) {
            let result = []; // 路径集合,不能放在全局,防止内存泄漏
            const traverse = (value, path, tree) => {
                if (tree.length === 0) return;
                for (let node of tree) {
                    path.push(node.value);
                    console.log(path, 'path');
                    if (node.value === value) {
                        result = JSON.parse(JSON.stringify(path)); // 一定是深拷贝,否则如果是复杂数据类型会出错
                        return;
                    }
                    const children = Array.isArray(node.children) ? node.children : [];
                    console.log(children, 'children----');
                    traverse(value, path, children);
                    path.pop(); // 回溯
                }
            };
            traverse(value, [], tree);
            return result;
        }

        console.log(findPath1(levelList, "20101"));
        console.log(findPath2(levelList, "2"));


        // js根据level1Id数组levelList中查找,输出 ['20000','20100','20101']
        // js根据level2Id数组levelList中查找,输出 ['10000','2']