2014-03-01 88 views
1

是否可以使用JavaScript或jQuery通過將多個鍵傳遞給函數來設置(並獲取)某個多維對象的值?因爲這句話可能沒有什麼意義,這裏有我想要完成一個代碼示例:將遞歸鍵的名稱傳遞給對象引用

obj = { 
    a:{ 
     a1:'a1', 
     a2:'a2' 
    }, 
    b:'b1', 
    c:'c1' 
}; 


function add_to_obj(key,value){ 
    obj[key] = value; 
} 

預期的行爲:

console.log(obj.a[b]); // 'b1'  
add_to_obj(b,'b1-new'); 
console.log(obj.a[b]); // 'b1-new'  

我想做什麼:

function how_to_do_this(key1[key2], value){ 
    obj[key1][key2] = value; 
} 
console.log(obj.a.a1); // 'a1' 
how_to_do_this("a.a1", "a1-new"); 
console.log(obj.a.a1); // 'a1-new' 

第二種方法是如何完成的?可以有多個「層」傳遞給參數,所以我試圖想辦法做到這一點。我最初雖然是通過一個分隔符,然後split()它,但似乎凌亂。

有什麼建議嗎?

+1

是在我你要找的行爲設定值?目前還不清楚你是否只想設置現有的深層屬性或者創建它們。 –

+0

在你的函數中使用[arguments](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments)。然後你可以傳遞類似'how_to_do_this(「a1-new」,「a」,「a1」);' –

+0

@EnjoysTurtles是的!這正是我正在尋找的功能。能夠很好地設置太深,但這對我的用途來說已經足夠了。我很想看看其他方法,但感謝您的幫助! –

回答

1

我是這樣做我:

var deepSet = function(obj, props, val){ 
    var attr = obj; 
    while(typeof props[1]==="string"){ 
    if(!attr[props[0]]) 
     attr[props[0]] = {}; 
    attr = attr[props.shift()]; 
    } 
    attr[props[0]] = val; 
    return obj; 
}; 

var test = {term: {value: "foo"}}; 
console.log(deepSet(test, ["term", "value"], "bar")); 
// {term: {value: "bar"}} 
+0

謝謝!我可以稍微調整一下'props = props.split('。')'看看是怎麼回事 –

1

這裏的另一種方法:

function how_to_do_this(value, root) { 
    var objToSet = root; 
    for (var i = 2; i < arguments.length - 1; i++) { 
     objToSet = objToSet[arguments[i]]; 
    } 
    objToSet[arguments[i]] = value; 
} 

您可以通過將新值,根對象,然後儘可能多的按鍵,只要你想叫它。它會遍歷鍵直到到達最後一個,然後將其設置爲所需的值。這是相當粗糙的,並且可能需要一些額外的錯誤檢查來測試密鑰的存在(或不存在)。

請參見:http://jsfiddle.net/5cb7y/

1

您也可以使用像這樣的任何級別

 function setvalue(obj, path, value) { 
      var parts = path.split('.'); 
      var o = obj; 
      if (parts.length > 1) { 
       for (var i = 0; i < parts.length - 1; i++) { 
        if (!o[parts[i]]) 
         o[parts[i]] = {}; 
        o = o[parts[i]]; 
       } 
      } 
      o[parts[parts.length - 1]] = value; 
     } 
     alert(obj.b); // 'b1' 
     setvalue(obj, "b", "b1-new"); 
     alert(obj.b); 
     setvalue(obj, "a.a1", "a1-new"); 
     alert(obj.a.a1)