簡體   English   中英

Javascript(子)通過鍵數組進行對象訪問

[英]Javascript (sub-) Object access by array of keys

是否可以通過鍵數組在對象中設置變量? 例如,我有這個對象:

var obj = {'outer': {'inner': 'value'} };

並希望設置由數組鍵選擇的值:

var keys = ['outer', 'inner'];

到新值'newValue'以獲得此結果:

obj = {'outer': {'inner': 'newValue'} };

你可以做的是迭代鍵數組,確保每個鍵都存在並引向另一個對象,直到你到達最后一個鍵,用於設置新值。

function setVal(obj, keys, value) {
  var o = obj,
    len = keys.length;

  // iterate through all keys, making sure each key exists and points to an object
  for (var i = 0; i < len - 1; i++) {
    var key = keys[i];

    // check if the current key exists and is an object
    if (obj.hasOwnProperty(key) && typeof obj[key] === 'object' && obj[key]) {
      o = o[key];
    } else {
      // return false or throw an error cause the key is not an object or is missing. 
    }
  }

  // update the value at the last key
  o[keys[len - 1]] = value;
}

這是一個運行的例子:

 function setVal(obj, keys, value) { var o = obj, len = keys.length; for (var i = 0; i < len - 1; i++) { var key = keys[i]; if (obj.hasOwnProperty(key) && typeof obj[key] === 'object' && obj[key]) { o = o[key]; } else { throw new Error('Key ' + key + ' is not an object or is missing.'); } } o[keys[len - 1]] = value; } var obj = { 'outer': { 'inner': 'value' } }; var validKeys = ['outer', 'inner']; var invalidKeys = ['outer', 'inner', 'extra']; console.log('Setting valid keys'); setVal(obj, validKeys, 'new value'); console.log(obj); console.log('Setting invalid keys'); setVal(obj, invalidKeys, 'new value'); console.log(obj); 

如果您希望方法僅更新現有鍵值而不設置新鍵值,則可以使用hasOwnProperty將最后一個語句包裝在setVal中:

// if object already has the last key, update its value
if (o.hasOwnProperty(keys[len - 1])) {
  o[keys[len - 1]] = value;
} else {
  // throw an error or return false since the last key doesn't exist.
}

這里的關鍵點是可以使用屬性名稱字符串訪問對象屬性: obj.prop <=> obj["prop"]

function SetValueByKeyNames(obj, keys, value) {
  var target = obj;
  for(var i = 0; i < keys.length - 1; i++) {
    target = target[keys[i]];
    if (!target)
      return false;
  }
  target[keys[keys.length - 1]] = value;
  return true;
}

var obj = {'outer': {'inner': 'value'} };
var keys = ['outer', 'inner'];

console.log(obj.outer.inner); // value
SetValueByKeyNames(obj, keys, 'newValue');
console.log(obj.outer.inner); // newValue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM