前端面试算法数组转换这一类的

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
//实现a到b
         a = [
            [id = "1", member_id = "2", goods_id = "4"],
            [id = "2", member_id = "3", goods_id = "5"],
            [id = "3", member_id = "2", goods_id = "6"],
            [id = "4", member_id = "3", goods_id = "7"],
            [id = "5", member_id = "3", goods_id = "8"],
        ]
         b = [
            [member_id = "2", _child = [
                [id = "1", goods_id = "4"],
                [id = "3", goods_id = "6"],
            ]],
            [member_id = "3", _child = [
                [id = "2", goods_id = "5"],
                [id = "4", goods_id = "7"],
                [id = "5", goods_id = "8"],
            ]],
        ]

```javascript
        /*请写个函数(调用函数1和函数2)(入参a,出参b。内部可以通过调用两个函数实现),
        实现a转化成b。先生成一个树形结构(函数1),然后再跟据树形结构生成列表(函数2)
        字段解释:id主键,pid父主键,path父子依赖路径*/
         a = [
            { id: 1, pid: 0 },
            { id: 2, pid: 0 },
            { id: 3, pid: 1 },
            { id: 4, pid: 1 },
            { id: 5, pid: 4 },
            { id: 6, pid: 3 },
            { id: 7, pid: 5 },
            { id: 8, pid: 7 }
        ];
        b = [
            {id:1,pid:0,path:'-0-'},
            {id:2,pid:0,path:'-0-'},
            {id:3,pid:1,path:'-0-1-'},
            {id:4,pid:1,path:'-0-1-'},
            {id:5,pid:4,path:'-0-1-4-'},
            {id:6,pid:3,path:'-0-1-3-'},
            {id:7,pid:5,path:'-0-1-4-5-'},
            {id:8,pid:7,path:'-0-1-4-5-7-'}
            ];

```

直接获取pid

img



    a = [
        { id: 1, pid: 0 },
        { id: 2, pid: 0 },
        { id: 3, pid: 1 },
        { id: 4, pid: 1 },
        { id: 5, pid: 4 },
        { id: 6, pid: 3 },
        { id: 7, pid: 5 },
        { id: 8, pid: 7 }
    ];
    function getPids(arr, pid) {
        var item, pids = '';
        while (item = arr.find(i => i.id == pid)) {
            pid = item.pid;
            pids = '-' + pid + pids ;
        }
        return pids;
    }
    function getB(a) {
        var b = [];
        a.forEach(i => {
            var path = getPids(a, i.pid) + '-' + i.pid + '-';
            var item = { id: i.id, pid: i.pid, path: path };
            b.push(item);
        });
        return b;
    }
    var b = getB(a);
    console.log(b)

一定要转嵌套后再转b类型的数组用下面的,path正确,但是循序会不一样,

img


    function FlatToNested(data) {//树数据源扁平结构转嵌套
        var idFiled = 'id';
        var parentField ='pid';
        var i, l, treeData = [], tmpMap = [];
        for (i = 0, l = data.length; i < l; i++) tmpMap[data[i][idFiled]] = data[i];
        for (i = 0, l = data.length; i < l; i++) {
            if (tmpMap[data[i][parentField]] && data[i][idFiled] != data[i][parentField]) {
                if (!tmpMap[data[i][parentField]]['children'])
                    tmpMap[data[i][parentField]]['children'] = [];
                tmpMap[data[i][parentField]]['children'].push(data[i]);
            } else {
                treeData.push(data[i]);
            }
        }
        return treeData;
    }
    function NestedToFlat(children, pid, path) {//树数据源嵌套结构转扁平
        var arr = [];
        if (!path) path = `-${pid}-`;
        else path += `${pid}-`;
        for (var i = 0; i < children.length; i++) {
            arr.push({ id: children[i].id,  pid: pid, path: path })
            if (children[i].children) arr = arr.concat(NestedToFlat(children[i].children, children[i].id, path));
        }
        return arr;
    }
    a = [
        { id: 1, pid: 0 },
        { id: 2, pid: 0 },
        { id: 3, pid: 1 },
        { id: 4, pid: 1 },
        { id: 5, pid: 4 },
        { id: 6, pid: 3 },
        { id: 7, pid: 5 },
        { id: 8, pid: 7 }
    ];
    var b = FlatToNested(a);
    b = NestedToFlat(b, 0);
    //b.sort((a, b) => { return a.path.localeCompare(b.path) });//这里可以增加排序得到和第一种方法一样的结果
    console.log(b)


img