ツリー構造のデータ、既知のノードの絶対パスを特定します(el-cascaderはデフォルト選択を提供します)

1947 ワード

ツリー構造のデータ、ノードのidが既知で、その絶対パスを見つけます(el-cascaderはデフォルト選択を提供します)
  • 需要
  • 実装形態
  • で発生した問題
  • 構想
  • を実現
  • 問題
  • これは私の个人的な考え方で、どこが间违いがあってどうぞよろしくお愿いします!

  • 需要
    製品にはパケットの機能があり、パケットのレベルは拡張を制限せず、各ユーザーにはパケットがあります(ユーザーは現在のパケットのidのみを保存します).
    インプリメンテーションモード
    element-uiのel-cascaderのコンポーネントを使用し、各ノードデータのidをキー値として使用します.
    データ構造**(id不規則)**
     [{
              id: 'eeeee1',
              name: '  1',
              children: [{
                id: 'eeeewe1',
              	name: '  1-1',
                children: [{
                  id: 'eeesdsde1',
             	  name: '  1-1-1',
             	  children:  ...
                },
                ...
                ],
                ...
          ]},
          ...
          ]
    

    問題
    ユーザーパケットを編集する場合は、デフォルトで選択する前のパケット情報が必要です.el-cascaderでは、デフォルトでチェックするには、v-modelを絶対パスの配列に設定する必要がありますが、ユーザーの現在のパケットidしか入手できませんので、絶対パスの配列を構築する必要があります.
    構想
    第一に考えられるのは再帰的な方法を用いてchildrenを循環して対応するidを取得することである.
    呼び出しメソッドは、まずターゲットのidを返し、親ノードのidも配列に配置します.これにより、逆のlistが得られます.最終配列を反転する必要があります.
    インプリメンテーション
    	var tmpParentIdList = [];
       function getTreeInitModel(key,list){
           for (var i = 0; i < list.length; i++) {
               if (list[i].id == key) {
                   tmpParentIdList.push(list[i].id);
                   return true;
               }else{
                   if (list[i].children && list[i].children.length > 0) {
                       if (getTreeInitModel(key,list[i].children)) {
                           tmpParentIdList.push(list[i].id);
                           return true;
                       }
                   } 
               }
           }
           return false;
       }
       
      :
    				tmpParentIdList = [];
                    getTreeInitModel(selectId,treeList);
                    this.treeModel = tmpParentIdList.reverse();
    

    に質問
    この方法は存在するノードに適用され、他の状況はまだテストされていません.
    **
    これは私の个人的な考え方で、どこが间违いがあってどうぞよろしくお愿いします!
    **