2013-08-01 47 views
0

我有一個很大的對象,我正在尋找在對象中找到一個生成的數字,而不知道它的路徑或位置。我如何搜索房產或價值甚至是布爾?如何在對象內搜索特定的int或字符串?

即具有其中一個屬性「版本」有前手「90」

var objy = { 
    example: 'unknown0', 
    example1: 'unknown1', 
    example2: 'unknown2', 
    example3: 'unknown3', 
    example4: 'unknown4', 
    example5: { 
     prop1: 1, 
     prop2: 2, 
     prop3: 3, 
     prop4: 4, 
     prop5: { 
      etc1: true, 
      etc2: false, 
      etc4: { 
       version: 90 
      } 
     } 
    } 
} 

http://jsfiddle.net/J5Avu/

這甚至可能不知道的「樹」的值對象的對象?

+1

你只是想確定是否給予'property'和'value'組合中的對象「樹」的任何地方存在? –

+0

是的,如果他們這樣做,其中 – captainrad

+1

你最後一個問題的答案是:是的,這是可能的,而不必事先知道「樹」。 –

回答

2

這是一個函數,它基本上遍歷對象的屬性,遞歸地查找propertyName/propertyValue組合,並隨時跟蹤「路徑」(jsfiddle)。如果沒有找到,則返回null

function findPropertyAndValueInObject(obj, prop, value, path) { 
    if(obj[prop] === value) { 
     return path; 
    } 
    else { 
     var foundPath = null; 
     for(var thisProp in obj) { 
      var propValue = obj[thisProp]; 
      if(typeof(propValue) === "object") { 
       foundPath = findPropertyAndValueInObject(propValue, prop, value, path + "." + thisProp); 
       if(foundPath !== null) { 
        break; 
       } 
      } 
     } 

     return foundPath; 
    } 
} 

console.log(findPropertyAndValueInObject(objy, "version", 90, "objy")); 
//prints out "objy.example5.prop5.etc4" 
0

該函數查找給定對象的屬性的值,該屬性在給定的字符串路徑上匹配。在這裏你可以找到一個fiddle與你的數據,然後在這裏使用wJs library。下面是獨立版本。

對於您的使用情況object_find('example5.prop5.etc4.version', object);將返回90

/** 
* Find data into an object using string path 
* like : "my.needle.name" into "haystack" 
* @param path 
* @param object object 
* @returns {*} 
*/ 
function object_find(path, object) { 
    var base = object, item; 
    path = path.split('.'); 
    while (path.length > 0) { 
     item = path.shift(); 
     if (base.hasOwnProperty(item)) { 
      base = base[item]; 
      if (path.length === 0) { 
       return base; 
      } 
     } 
    } 
    return false; 
}