2016-07-28 93 views
-3

我有一個多維對象。我需要在每個節點中搜索一個字符串,並且需要返回包含該字符串的節點數組。JavaScript對象搜索並獲取所有可能的節點

例如

對象

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

,如果我要搜索 'PQ' 我需要

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