2014-01-24 83 views
1

JavaScript的:給定的一個字符串數組:字符串 'properties.dimensions.length' 來訪問哈希{屬性:{尺寸:{長度:23}}}

['properties.dimensions.length', 'properties.name'] 

這將是用最好的方式這些驗證或訪問他們(實際上只是想驗證密鑰是否存在)在一個哈希?

我在考慮字符串拆分('。'),但我一直無法真正理解如何使用每個數組值來驗證或訪問哈希值。

像[「屬性」,「尺寸」,「長」],然後是的forEach向下鑽取,但理想的我想將其轉換成代碼的當量:

myProperties['properties']['dimensions']['length'] 

但感覺可以自由地說,如果這是一個非常冒險的方法......並且很好! :-D

回答

6

你可以嘗試這樣的事:

function hasProperty(obj, props) { 
    if (typeof props === "string") 
     return hasProperty(obj, props.split(".")); 
    for(var i = 0; i < props.length; i++) { 
     if (props[i] in obj) 
      obj = obj[props[i]]; 
     else 
      return false; 
    } 

    return true; 
} 

,並調用它是這樣的:

Demonstration

這裏是一個遞歸的選擇:

function hasProperty(obj, props) { 
    if (typeof props === "string") 
     return hasProperty(obj, props.split('.')); 
    return props.length == 0 || props[0] in obj && hasProperty(obj[props.shift()], props); 
} 

var propPath = 'properties.dimensions.length'; 
console.log(hasProperty(myProperties, propPath)); 

Demonstration

+0

+1,雖然我認爲遞歸函數會更短並且更具可讀性 – slezica

+0

@uʍopǝpısdn添加遞歸版本以獲得樂趣 –

+0

它的工作原理!而且很好。你幾乎在我提交之前就回答了!你爲國家安全局工作嗎? :-D非常感謝! –