我有一个简单的点表示法getter函数,我希望有一个以相同方式工作的setter。有任何想法吗?

var person = {
    name : {
       first : 'Peter',
       last  : 'Smith'
    }
};

// ---

var dotGet = function(str, obj) {

    return str.split('.').reduce(function(obj, i) {
        return obj[i];
    }, obj);

};

var dotSet = function(str, value, obj) {

    // updated, thx to @thg435
    var arr = str.split('.');

    while (arr.length > 1) {
        obj = obj[arr.shift()];
    }

    obj[arr.shift()] = value;

    return obj;

}

// returns `Peter`
var a = dotGet('person.name.first', person);

// should set `person.name.first` to 'Bob'
var b = dotSet('person.name.first', 'Bob', person);

最佳答案

var set = function (exp, value, scope) {
  var levels = exp.split('.');
  var max_level = levels.length - 1;
  var target = scope;
  levels.some(function (level, i) {
    if (typeof level === 'undefined') {
      return true;
    }
    if (i === max_level) {
      target[level] = value;
    } else {
      var obj = target[level] || {};
      target[level] = obj;
      target = obj;
    }
  });
};


您可以签出my expression compiler满足您需要的内容以及更多内容。

用法是:

var scope = {};
set('person.name', 'Josh', scope);

scope.person.name === 'Josh'

关于javascript - 实现点表示法Getter/Setter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11032572/

10-14 03:32