【问题标题】:Javascript (sub-) Object access by array of keysJavascript(子)通过键数组访问对象
【发布时间】:2016-05-18 21:37:33
【问题描述】:

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

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

并希望设置由键数组选择的值:

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

到一个新的值'newValue'以获得这个结果:

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

【问题讨论】:

    标签: javascript arrays object javascript-objects


    【解决方案1】:

    这里的关键点是可以使用属性名称字符串访问对象属性: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
    

    【讨论】:

    • 刚刚看到你打败了我,我们有同样的想法:),+1。
    • 拜托,一点解释都没有?
    【解决方案2】:

    您可以做的是遍历键数组,确保每个键都存在并指向另一个对象,直到您到达用于设置新值的最后一个键。

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

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2015-08-28
      • 2017-11-17
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多