3

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

这是我想做的:

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

4 回答 4

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/

于 2012-04-20T21:44:46.943 回答
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;
}

工作演示。

于 2012-04-20T20:58:15.653 回答
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');

于 2014-12-11T16:04:30.507 回答
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);
于 2015-04-11T10:08:02.867 回答