通过点符号字符串在对象文字中设置深度?

时间:2012-04-20 20:44:36

标签: javascript

有很多解决方案可以检查/访问一个带有点符号字符串的对象文字,但我需要做的是根据点符号字符串设置一个对象文字。这是非常技术性的,为什么我需要这样做,如果不可行,我会提出一个不同的解决方案。

以下是我想做的事情:

var obj = { 
   'a': 1, 
   'b': 2, 
    'c': { 
      'nest': true 
    } 
};

我想要一个可以这样工作的函数:

setDepth(obj, 'c.nest', false);

这会将obj改为:

var obj = { 
   'a': 1, 
   'b': 2, 
    'c': { 
      'nest': false
    } 
};

我已经尝试了一个小时但还未能找到一个好的解决方案。另一个帮助将非常感激!

4 个答案:

答案 0 :(得分:6)

我的版本:

function setDepth(obj, path, value) {
    var tags = path.split("."), len = tags.length - 1;
    for (var i = 0; i < len; i++) {
        obj = obj[tags[i]];
    }
    obj[tags[len]] = value;
}

工作演示:http://jsfiddle.net/jfriend00/Sxz2z/

答案 1 :(得分:2)

这是一种方法:

function setDepth(obj, path, value) {
    var levels = path.split(".");
    var curLevel = obj;
    var i = 0;
    while (i < levels.length-1) {
        curLevel = curLevel[levels[i]];
        i++;
    }
    curLevel[levels[levels.length-1]] = value;
}

Working demo.

答案 2 :(得分:2)

我修改了Elliot的答案,让它添加新节点(如果它们不存在)。

var settings = {};

function set(key, value) {
  /**
         * Dot notation loop: http://stackoverflow.com/a/10253459/607354
         */
  var levels = key.split(".");
  var curLevel = settings;
  var i = 0;
  while (i < levels.length-1) {
    if(typeof curLevel[levels[i]] === 'undefined') {
      curLevel[levels[i]] = {};
    }

    curLevel = curLevel[levels[i]];
    i++;
  }
  curLevel[levels[levels.length-1]] = value;

  return settings;
}

set('this.is.my.setting.key', true);
set('this.is.my.setting.key2', 'hello');

答案 3 :(得分:0)

就这样做:

new Function('_', 'val', '_.' + path + ' = val')(obj, value);

在你的情况下:

var obj = { 
   'a': 1, 
   'b': 2, 
    'c': { 
      'nest': true 
    } 
};

new Function('_', 'val', '_.c.nest' + ' = val')(obj, false);