我如何动态访问/创建嵌套对象(根据循环中的数字进行深入研究)



我有几个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);

最新更新