2016-07-28 6 views
-3

私は多次元のオブジェクトを持っています。私は各ノードの文字列を検索する必要があり、ノードの配列を返す必要がある文字列が含まれています。JavaScriptオブジェクトの検索と可能なすべてのノードの取得

私は 'PQ' 検索したい場合は

オブジェクト

{ 
    "data": { 
    "countries": "['abc','pqr','xyz']", 
    "movies": { 
     "actor": "['abc','pqr','xyz']", 
     "movie": "['abc','pqr','x toyz']" 
    } 
    } 

は、私は結果として

countries:pqr 
movies:actor:pqr 
countries:movie:pqr 

を持つ配列を必要としています。

+0

が含まれている必要がありますでしたあなたが検索する必要があるものについてもっと具体的にする - JSONの特定のキーまたは特定の値を探しているか?質問の性質をよりよく理解するために、入力と出力の例がありますか? – Davis

+0

私はちょうどあなたが理解することができる質問を更新する? – Vigikaran

+0

それはかなり理解しやすいです。私は解決策のアイディアを持っています。私はすぐにそれを持っていきます。 – Davis

答えて

1

あなたは再帰関数でこれを試してみて、解決できるが、これはのような配列を出力

function parse(string, key, before) { 
    return before+key+":"+string; 
} 

function findString(string, json, before) { 
    var results = []; 
    for (var key in json) { 
     if (typeof(json[key]) === "string") { // it is a string 
      if (json[key].contains(string)) { // it contains what it needs to 
       results.push(parse(string, key, before)); 
      } 
     } else { // it is an object 
      Array.prototype.push.apply(results, findString(string, json[key], before+key+":")); 
     } 
    } 
    return results; 
} 

var json = { 
    data: { 
    countries: "['abc','pqr','xyz']", 
    movies: { 
     actor: "['abc','pqr','xyz']", 
     movie: "['abc','pqr','x toyz']" 
    }, 
    oranges: { 
     potatoes: "['abc','pqr','xyz']", 
     zebras: { 
      lions: "['abc','pqr','xyz']", 
      tigers: "oh my!" // does not get added 
     } 
    } 
    } 
}; 

console.log(findString("pqr", json.data, "")); 

を呼び出します。

Array [ "countries:pqr", "movies:actor:pqr", "movies:movie:pqr", "oranges:potatoes:pqr", "oranges:zebras:lions:pqr" ] 
+0

これは期待どおりに動作しています。あなたの回答よりも – Vigikaran

+0

助けてくれてうれしいです!私が知っていることは、文字列が見つかるかどうかを調べるチェックが文字列全体の中のチェックであることです。だから私は '['abc'、 'pqr'、 'xyz']'のような文字列全体を見ています。 'abc'、' pqr'、 'xyz'のような文字列の中の値だけを見るには' if(json [key] .contains(string)) '行を変更しなければなりません。複雑な論理。 – Davis

+0

あなたはPHPで同じを使用する方法を知っていますか? – Vigikaran

1
var data = { 
    "countries": "['abc','pqr','xyz']", 
    "movies": { 
    "actor": "['abc','pqr','xyz']", 
    "movie": "['abc','pqr','x toyz']" 
    } 
} 

var listAll = function(obj, match, parent){ 
    for(var key in obj){ 
    if(typeof obj[key] === "string"){ 
     for(var word of obj[key].split("'")){ 
     if(word.indexOf(match) !== -1){ 
      if(!parent){ 
      console.log(key + ':' + word); 
      } 
      else{ console.log(parent+":"+key + ':' + word); } 
     } 
     } 
    }else{ 
     listAll(obj[key], match, (parent||'') + key); 
    } 
    } 
} 

listAll(data,'pq'); 

> countries:pqr 
> movies:actor:pqr 
> movies:movie:pqr 

を今では完全な親リスト

+0

彼のサンプル出力では、親オブジェクトの完全なリストが重要であることを示唆する 'movies:actor:pqr'を表示しました。 – Davis

関連する問題