2013-08-01 46 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; 
}