2016-07-28 31 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