2017-06-18 12 views
-1

私はキーを入力として受け取り、そのキーの値をフェッチするオブジェクトの配列を反復する再帰的メソッドを持っています。Typescript/Javascript:キーの値を取得するための再帰的メソッド

Plunker

しかし、あまりにも多くのforループは、コードのこの部分に関与している

findKeyFun(passedKey: string): string { 
    let tempVal = null; 
    for(let i=0; i< this.valueArray.length; i++) { 
     if(this.valueArray[i].children) { 
     for(let j=0; j< this.valueArray[i].children.length; j++) { 
      if(this.valueArray[i].children[j].children) { 
      for(let k=0; k<this.valueArray[i].children[j].children.length; k++){ 
       if(this.valueArray[i].children[j].children[k].key==passedKey){ 
       tempVal = this.valueArray[i].children[j].children[k].value; 
       return tempVal; 
       } 
      } 
      } 
     } 
     } 
    } 
    return tempVal; 
    } 
。キーの位置に関係なく、この再帰的メソッドを作るにはどうすればよいですか?

+1

あなたのコードはちょっと難しいです。あなたのデータの構造は何ですか? – aeid

+0

@aeidそれはオブジェクトの配列であり、各オブジェクトは子供/孫を持っているかもしれないし、持っていないかもしれません。 – Protagonist

+0

再帰は見つけることができますが、 'array.reduce'ははるかに優れています。 – aeid

答えて

0

私は小さなサンプルを作成しました。

コンテナクラスは、おそらく使用しているデータ構造に似ています。それには鍵と一連の子供たちがあります。

あなたの質問で使用しているアルゴリズムは非常に問題があります。最初のオブジェクトの子の子のキーのみを検索します。初期オブジェクトに正しいキーがある場合でも、nullを返すことができます。

私は深みのある最初の検索を実装しました。 これは、階層内の任意の場所で正しい子を返します。

class Container{ 
    key: string; 
    children: Container[]; 
} 

function searchKey(container: Container, key:string){ 
    if (container.key == key) { 
     return container; 
    } 
    else if (container.children.length>0){ 
     for (var child of container.children) { 
      var found = searchKey(child, key); 
      if (found != null) { 
       return found 
      } 
     } 
    } 
    return null 
} 

このタイプのアルゴリズムについてお読みになることをお勧めします。

ここでは素敵なwikipediaの記事です。

+0

これは、オブジェクト配列({[])で動作します。しかし、入力がオブジェクトの配列([{}])の場合、それをどのように処理するのですか?たとえば、次のようになります。function searchKey(container:Container []、key:string){} – Protagonist

関連する問題