Javascript(子)对象通过键数组访问

标签 javascript arrays object javascript-objects

是否可以通过键数组在对象中设置变量? 例如我有这个对象:

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.
}

关于Javascript(子)对象通过键数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35282950/

相关文章:

c++ - 如何在 linux 下检查 c++ .to 文件?

javascript - 没有 jQuery 来选择所有下拉列表,相当于 $ ("select") 吗?

javascript - 'Error: uncaught exception: Syntax error, unrecognized expression: [object Object]' 在 jQuery 中意味着什么?

arrays - 如何填写列表(类型)?

java - 二维长数组向值附加一个额外的零

python - 从列表中删除一个对象?

javascript - 通过rails中select_tag中的id访问在javascript中分配的值

javascript - 为什么我尝试向表中添加新行(使用/o k 表元素制作)不断出现并消失?

java - 使用特定数字来达到目标​​数字

Javascript 特异性(仅响应单击的项目)