js 實現 多層級對象合並


js 實現 多層級對象合並

首先

需求是使用js對數據的格式進行轉換 把一個二維數組(包含層級信息,層級數是不固定的)list 轉換為多層級的對象

我的思路就是 循環先把list里單條信息轉換為 多層級對象 然后和上一條 進行合並

原數據類型:

[{
	id:a_a1_a2,
	value:1
},{
	id:a_a2_a2,
	value:2
},{
	id:b_b1,
	value:3
}]

分別轉換為:

[a{
	a1{
		a2:1
	}
}]
[a{
	a2{
		a2:2
	}
}]
[b{
 	b1:3
 }]

最終合並效果:

{a{
	a1{
		a2:1
	},
	a2{
		a2:2
	}
 },
 b{
 	b1:3
 }
 }
  
onSubmit(): void {

    // 整理 item 數據

    let itemsListInfo = {};

	//this.addItemListData 存放的原始數據
    for (let i = 0; i < this.addItemListData.length; i++) {

      const itemTree = this.addItemListData[i].id.split('_');

      // 按照格式整理 當前item
      let thisItemInfo = {};

      for (let y = itemTree.length - 1; y >= 0; y--) {

        if (y === itemTree.length - 1) {

          thisItemInfo[itemTree[y]] = this.addItemListData[i].value;

        } else {

          // 如果直接賦值 會出現問題 需要使用另一個變量暫存
          const data = thisItemInfo;
          thisItemInfo = {};
          thisItemInfo[itemTree[y]] = data;

        }

      }

      console.log(thisItemInfo);
      // 合並當前item 到itemListInfo

      const itemTreeIndex = 0;

      itemsListInfo = this.margeItem(itemsListInfo, thisItemInfo, itemTree, itemTreeIndex, this.addItemListData[i]);

    }

  }

  margeItem(itemsListInfo: any, thisItemInfo: any, itemTree: any, itemTreeIndex: number, addItemListData: any): any {

    // 遞歸 判斷是否存在相同層級
    // 直到 沒有相同層級后 合並對象到上一級
    // 注意 如果是初次進入(沒有上一級) 就直接賦值

    if (itemsListInfo.hasOwnProperty(itemTree[itemTreeIndex])) {

      itemsListInfo[itemTree[itemTreeIndex]]
        = this.margeItem(
          itemsListInfo[itemTree[itemTreeIndex]],
          thisItemInfo[itemTree[itemTreeIndex]],
          itemTree,
          itemTreeIndex + 1,
          addItemListData
        );

      return itemsListInfo;
    } else {

      let lastData = {};

      if (itemsListInfo.hasOwnProperty(itemTree[itemTreeIndex - 1])) {

        lastData = itemsListInfo[itemTree[itemTreeIndex - 1]];
        lastData[itemTree[itemTreeIndex]] = thisItemInfo[itemTree[itemTreeIndex]];

      } else {

        lastData = thisItemInfo[itemTree[itemTreeIndex]];
      }

      itemsListInfo[itemTree[itemTreeIndex]] = lastData;
      return itemsListInfo;

    }

  }

最后itemsListInfo就是我需要的最終格式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM