求解一个js数组的问题

var cloumns = [
            ["家具类", "沙发", "温州市", 287589],
            ["家具类", "沙发", "光州市", 731786],
            ["家具类", "柜子", "杭州市", -4554],
            ["家具类", "柜子", "湖州市", -13556],
            ["家具类", "柜子", "嘉兴市", 6883],
            ["家具类", "床", "湖州市", 266137],
            ["家具类", "床", "嘉兴市", 113187],
            ["服装类", "童装", "广州市", 329072],
            ["服装类", "童装", "深圳市", 614692],
            ["服装类", "童装", "成都市", 229967],
            ["服装类", "童装", "嘉兴市", 66641],
            ["服装类", "女装", "成都市", 294351],
            ["服装类", "女装", "广州市", 52]
        ];

如上一个数组,如何转为这种形式:

var translateData = {
            nodes: [
                {
                    name: "家具类",
                    nodes: [
                        {
                            name: "沙发",
                            nodes: [
                                {
                                    name: "温州市",
                                    value: 287589
                                },
                                {
                                    name: "光州市",
                                    value: 731786
                                }
                            ]
                        },
                        {
                            name: "柜子",
                            nodes: [
                                {
                                    name: "杭州市",
                                    value: -4554
                                },
                                {
                                    name: "湖州市",
                                    value: -13556
                                }
                            ]
                        }
                    ]
                }, {
                    name: "服装类",
                    nodes: [
                        {
                            name: "童装",
                            nodes: [
                                {
                                    name: "广州市",
                                    value: 287589
                                }
                            ]
                        }
                    ]
                }
            ]
        }
阅读 2.2k
3 个回答

先把 数组第一个相同的提取出来组成一个数组。再分别遍历它们。数据结构就随你处置了

        //节点固定3层的话可以采用以下方法
        const cloumns = [
            ["家具类", "沙发", "温州市", 287589],
            ["家具类", "沙发", "光州市", 731786],
            ["家具类", "柜子", "杭州市", -4554],
            ["家具类", "柜子", "湖州市", -13556],
            ["家具类", "柜子", "嘉兴市", 6883],
            ["家具类", "床", "湖州市", 266137],
            ["家具类", "床", "嘉兴市", 113187],
            ["服装类", "童装", "广州市", 329072],
            ["服装类", "童装", "深圳市", 614692],
            ["服装类", "童装", "成都市", 229967],
            ["服装类", "童装", "嘉兴市", 66641],
            ["服装类", "女装", "成都市", 294351],
            ["服装类", "女装", "广州市", 52]
        ]

        //第一层,第二层,第三层,节点数组
        const nodes = [];
        let first, second;

        //遍历cloumns
        cloumns.forEach(row => {
            //如果有row[0]的节点,记录节点,没有则添加节点
            const firstFlag = nodes.some(firstNode => {
                if (firstNode.name == row[0]) first = firstNode;
                return firstNode.name == row[0]
            })

            if (!firstFlag) {
                first = {
                    name: row[0],
                    nodes: []
                }
                nodes.push(first)
            }

            //如果有row[1]的节点,记录节点,没有则添加节点
            const secondFlag = first.nodes.some(secondNode => {
                if (secondNode.name == row[1]) second = secondNode;
                return secondNode.name == row[1]
            })

            if (!secondFlag) {
                second = {
                    name: row[1],
                    nodes: []
                }
                first.nodes.push(second)
            }

            //看数据第三层数据应该是唯一的,所以直接push
            second.nodes.push({
                name: row[2],
                value: row[3]
            })
        })
function trans (arr) {
    let result = {nodes: []}
    let depth = arr[0].length - 1
    if (!arr.length || depth < 1) return obj

    let cache = {
        '': result.nodes
    }

    ;[...new Array(depth).keys()].map(i => +i).forEach(i => {
        arr.forEach(cur => {
            let key = cur[i]
            let allKey = cur.reduce((sum, cur, j) => sum += j < i ? cur : '', '')
            if (i === depth - 1) {
                return cache[allKey].push({name: key, value: cur[i + 1]})
            }
            if (!cache[allKey + key]) {
                let obj = {name: key, nodes: []}
                cache[allKey].push(obj)
                cache[allKey + key] = obj.nodes
            }
        })
    })
    return result
}
trans(cloumns)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题