我有一个简单的点表示法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/