鍍金池/ 問(wèn)答/HTML/ JS面試題-計(jì)算題,寫(xiě)個(gè)函數(shù),把數(shù)組變成對(duì)象結(jié)構(gòu)

JS面試題-計(jì)算題,寫(xiě)個(gè)函數(shù),把數(shù)組變成對(duì)象結(jié)構(gòu)

請(qǐng)問(wèn),下面 data數(shù)組,如何寫(xiě)一個(gè)函數(shù),使 data數(shù)組變成 tree的格式結(jié)構(gòu)。
var data = [
{id:"2", value:"xxx"},
{id:"3", value:"xxx"},
{id:"4", value:"xxx"},
{id:"6", value:"xxx"},
{id:"5", value:"xxx"},
{id:"1", value:"xxx"},
]
寫(xiě)個(gè)函數(shù)變?yōu)?br>var tree = {

"1":{
    "children":{
        "2":{
            "children":{
                "4":{
                    "children":{
                        "6":{
                        
                        }
                    }
                }
            }
        }
    }
},
"3":{
    "children":{
        "5":{
            
        }
    }
}

}

回答
編輯回答
命多硬

大兄弟,你這tree完全沒(méi)有規(guī)律啊

2017年1月10日 12:50
編輯回答
心沉

實(shí)現(xiàn)了,主要考了3點(diǎn):

  1. 邏輯
  2. 遞歸
  3. Object.keys()

代碼未優(yōu)化,先去吃飯了,本地測(cè)試完成

var data = [
    { id: "2", value: "xxx" },
    { id: "3", value: "xxx" },
    { id: "4", value: "xxx" },
    { id: "6", value: "xxx" },
    { id: "5", value: "xxx" },
    { id: "1", value: "xxx" },
];
var tree = {

    "1": {
        "children": {
            "2": {
                "children": {
                    "4": {
                        "children": {
                            "6": {

                            }
                        }
                    }
                }
            }
        }
    },
    "3": {
        "children": {
            "5": {

            }
        }
    }
};

function trans(data) {
    let dataSort = data.sort((a, b) => {
        return a.id - b.id < 0 ? -1 : 1;
    });

    let tree;

    for (let i = 0; i < dataSort.length; i++) {
        let idNum = dataSort[i].id;
        let isEven = Number(idNum) % 2 === 0;

        if (tree === undefined) {
            tree = {};
            tree[1] = {};
        } else if (isEven) {
            appendChildAttr(tree[1], idNum);
        } else {

            if (tree[3] === undefined) {
                tree[3] = {};
            }else {
                appendChildAttr(tree[3], idNum);    
            }            
            
        }

        function appendChildAttr(parNode, childrenId) {

            if (Object.keys(parNode).length === 0) {
                parNode.children = {};
                parNode.children[childrenId] = {};
            } else {
                appendChildAttr(parNode.children[Object.keys(parNode.children)[0]], childrenId);
            }

        }
    }
    return tree;
}

console.log(JSON.stringify(trans(data))===JSON.stringify(tree));

2018年8月21日 22:47
編輯回答
小眼睛

實(shí)現(xiàn)是可以實(shí)現(xiàn),按上樓那種方式,不知道是不是你自己理解畫(huà)出來(lái)的tree,如果是那你應(yīng)該理解錯(cuò)了,數(shù)組轉(zhuǎn)成tree,那里面的對(duì)象元素不應(yīng)該去動(dòng)啊。如果題目給的就是這個(gè)樹(shù),那當(dāng)我沒(méi)說(shuō)。

2018年6月7日 07:46