鍍金池/ 問(wèn)答/HTML5  HTML/ 求解一個(gè)js數(shù)組的問(wèn)題

求解一個(gè)js數(shù)組的問(wèn)題

var cloumns = [
            ["家具類(lèi)", "沙發(fā)", "溫州市", 287589],
            ["家具類(lèi)", "沙發(fā)", "光州市", 731786],
            ["家具類(lèi)", "柜子", "杭州市", -4554],
            ["家具類(lèi)", "柜子", "湖州市", -13556],
            ["家具類(lèi)", "柜子", "嘉興市", 6883],
            ["家具類(lèi)", "床", "湖州市", 266137],
            ["家具類(lèi)", "床", "嘉興市", 113187],
            ["服裝類(lèi)", "童裝", "廣州市", 329072],
            ["服裝類(lèi)", "童裝", "深圳市", 614692],
            ["服裝類(lèi)", "童裝", "成都市", 229967],
            ["服裝類(lèi)", "童裝", "嘉興市", 66641],
            ["服裝類(lèi)", "女裝", "成都市", 294351],
            ["服裝類(lèi)", "女裝", "廣州市", 52]
        ];

如上一個(gè)數(shù)組,如何轉(zhuǎn)為這種形式:

var translateData = {
            nodes: [
                {
                    name: "家具類(lèi)",
                    nodes: [
                        {
                            name: "沙發(fā)",
                            nodes: [
                                {
                                    name: "溫州市",
                                    value: 287589
                                },
                                {
                                    name: "光州市",
                                    value: 731786
                                }
                            ]
                        },
                        {
                            name: "柜子",
                            nodes: [
                                {
                                    name: "杭州市",
                                    value: -4554
                                },
                                {
                                    name: "湖州市",
                                    value: -13556
                                }
                            ]
                        }
                    ]
                }, {
                    name: "服裝類(lèi)",
                    nodes: [
                        {
                            name: "童裝",
                            nodes: [
                                {
                                    name: "廣州市",
                                    value: 287589
                                }
                            ]
                        }
                    ]
                }
            ]
        }
回答
編輯回答
歆久

先把 數(shù)組第一個(gè)相同的提取出來(lái)組成一個(gè)數(shù)組。再分別遍歷它們。數(shù)據(jù)結(jié)構(gòu)就隨你處置了

2017年1月12日 10:25
編輯回答
下墜
        //節(jié)點(diǎn)固定3層的話(huà)可以采用以下方法
        const cloumns = [
            ["家具類(lèi)", "沙發(fā)", "溫州市", 287589],
            ["家具類(lèi)", "沙發(fā)", "光州市", 731786],
            ["家具類(lèi)", "柜子", "杭州市", -4554],
            ["家具類(lèi)", "柜子", "湖州市", -13556],
            ["家具類(lèi)", "柜子", "嘉興市", 6883],
            ["家具類(lèi)", "床", "湖州市", 266137],
            ["家具類(lèi)", "床", "嘉興市", 113187],
            ["服裝類(lèi)", "童裝", "廣州市", 329072],
            ["服裝類(lèi)", "童裝", "深圳市", 614692],
            ["服裝類(lèi)", "童裝", "成都市", 229967],
            ["服裝類(lèi)", "童裝", "嘉興市", 66641],
            ["服裝類(lèi)", "女裝", "成都市", 294351],
            ["服裝類(lèi)", "女裝", "廣州市", 52]
        ]

        //第一層,第二層,第三層,節(jié)點(diǎn)數(shù)組
        const nodes = [];
        let first, second;

        //遍歷cloumns
        cloumns.forEach(row => {
            //如果有row[0]的節(jié)點(diǎn),記錄節(jié)點(diǎn),沒(méi)有則添加節(jié)點(diǎn)
            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]的節(jié)點(diǎn),記錄節(jié)點(diǎn),沒(méi)有則添加節(jié)點(diǎn)
            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)
            }

            //看數(shù)據(jù)第三層數(shù)據(jù)應(yīng)該是唯一的,所以直接push
            second.nodes.push({
                name: row[2],
                value: row[3]
            })
        })
2018年8月1日 21:21
編輯回答
孤客
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)
2017年9月30日 03:35