2017-05-15 10 views
0

私は、以下のfindKeyアルゴリズムを(nodejsで)拡張して、keyObjの署名と一致するツリー内の子オブジェクトのインスタンスをすべて見つけようとしています。元そのアルゴリズム:木のようなjsオブジェクトで特定の "キーオブジェクト"を持つすべての子プロパティを見つける

Object.prototype.findKey = function(keyObj) { 
    var p, key, val, tRet; 
    for (p in keyObj) { 
     if (keyObj.hasOwnProperty(p)) { 
      key = p; 
      val = keyObj[p]; 
     } 
    } 

    for (p in this) { 
     if (p == key) { 
      if (this[p] == val) { 
       return this; 
      } 
     } else if (this[p] instanceof Object) { 
      if (this.hasOwnProperty(p)) { 
       tRet = this[p].findKey(keyObj); 
       if (tRet) { 
        return tRet; 
       } 
      } 
     } 
    } 

    return false; 
} 

すべて見つける達成ATT私の最初の素朴なattemption:次のように

Object.prototype.findAllWithKey = function(keyObject) { 
    let objectCopy = Object.assign({}, this); 
    console.log('findAll on : \n\n'); 
    console.log(this); 
    let keyFound = false; 
    let keysFound = []; 
    do { 
     console.log("while loop iteration..."); 
     keyFound = objectCopy.findKey(keyObject); 
     console.log(keyFound); 
     if (keyFound) { 
      keysFound.push(keyFound); 
      console.log('\n\nkey found:'); 
      objectCopy = JSON.parse(JSON.stringify(objectCopy).replace(JSON.stringify(keyFound)+',', '')); 
     } else { 
      console.log('\n\n key not found'); 
      keyFound = false; 
     } 

    } while (keyFound !== false); 
    console.log('Broke out of while loop') 
}; 

使用量は次のとおりです。

応答オブジェクトがjsのツリー構造が含まれてい
 let targetObject = response.findAllWithKey({ 
      name: 'GetStatusCode' 
     }); 

複数の子と{name: 'GetStatusCode'}を持つサブオブジェクトのインスタンスがその中にあります。

JSONのstringify/parsingが不確定であると感じているので、誰かがこれを実装するためのより良い方法を見つけるための正しい方法を指し示すことができますか?(これはいいえ、そこから最後のオブジェクトに失敗します。 findAllを達成するためのより良い方法が必要です)。

+0

サンプル入力と対応する出力を共有できますか? – Rajesh

答えて

0

私はxml、jsonまたはwhatheverがツリー構造として実際に構成されているため、ツリートラバーサルを使用してfind allを実行できます。たとえば、preorderのトラバーサルのアルゴリズムを使うことができます(lodashはcontribパッケージ内のツリートラバーサルのためのいくつかの助けを提供します)。

Object.prototype.findAllWithKey = function(keyObject) { 
    resultSet = [], i = 0; 
    _.walk.preorder(this, function(value, key, parent) { 
     if (keyObject[key] === value) { 
      resultSet.push(parent); 
     } 
    }); 
    return resultSet; 
}; 
+0

タグが付いていないlibで質問に答えると誤解を招く恐れがあり、下線を引き付ける可能性があります – Rajesh

+0

予約注文/トラバーサルを達成するために好きなものを使用することができます。 –

関連する問題