簡體   English   中英

我如何動態訪問/創建嵌套對象(根據循環中的數字更深入)

[英]How can i access/create nested objects dynamically (go deeper based on a number in a loop)

我有幾個if語句,它們的功能幾乎完全相同,而currentHierarchie對象上只有一個層次。 任何人都可以幫助我將此循環(或其他)。 這種方式的if語句的數量必須與laneAndAllParentLanesIds.length相同。

private createLaneHierarchieStructure(laneAndAllParentLanesIds: any[], currentHierarchie) {
    for (let i = 0; i < laneAndAllParentLanesIds.length; i++) {
        const obj = currentHierarchie;
        const keys = laneAndAllParentLanesIds;

        if (i === 0 && !obj[keys[i]])
            obj[keys[i]] = {};

        if (i === 1 && !obj[keys[i - 1]][keys[i]])
            obj[keys[i - 1]][keys[i]] = {};

        if (i === 2 && !obj[keys[i - 2]][keys[i - 1]][keys[i]])
            obj[keys[i - 2]][keys[i - 1]][keys[i]] = {};

        if (i === 3 && !obj[keys[i - 3]][keys[i - 2]][keys[i - 1]][keys[i]])
            obj[keys[i - 3]][keys[i - 2]][keys[i - 1]][keys[i]] = {};

        if (i === 4 && !obj[keys[i - 4]][keys[i - 3]][keys[i - 2]][keys[i - 1]][keys[i]])
            obj[keys[i - 4]][keys[i - 3]][keys[i - 2]][keys[i - 1]][keys[i]] = {};
    }
    return currentHierarchie;
}

此代碼的示例響應 (多次調用並將其保存到同一對象( currentHierarchie )之后,如下所示:

for (let i = 0; i < boards.length; i++) {
    let laneHierarchie = {};
    boards[i]['info']['lanes'].forEach(lane => {
        const laneAndAllParentLanesIds = this.getAllParentLanes(i, lane);
        laneHierarchie = this.createLaneHierarchieStructure(laneAndAllParentLanesIds, laneHierarchie);
    });
    console.log(laneHierarchie);
}

您可以將obj變量聲明和初始化移到for循環之外,並且僅將單個值用作檢查obj鍵,並在必要時分配一個空數組。

然后將下一個循環的最后一個屬性分配給obj

const obj = currentHierarchie;

for (let key of laneAndAllParentLanesIds) {
    obj[key] = obj[key] || {};
    obj = obj[key];
}

一個帶有reduce的版本

void laneAndAllParentLanesIds.reduce((o, id) => o[id] = o[id] || {}, currentHierarchie);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM