我想设置变量user.stackoverflow.name
,而这正是我想用它创建的。我可以使用完整变量创建深度属性吗?我知道npm module dotty允许您使用这样的字符串设置深度属性。
dotty.put(user, "stackoverflow.name", "thomas")
我真的希望能够设置这样的深层属性。
user.stackoverflow.name = "thomas"
或
createDeep(user.stackoverflow.name, "thomas")
如有必要,创建嵌套对象。
这可能吗?
答案 0 :(得分:0)
这适用于全局变量:
function createDeep(name, value) {
var current = window;
var fields = name.split('.');
var suffix = fields[fields.length-1];
for (var i = 0; i < fields.length-1; i++) {
var curfield = fields[i];
if (!(curfield in current)) {
current[curfield] = {};
}
current = current[curfield];
}
current[suffix] = value;
}
createDeep('user.stackoverflow.name', 'thomas');
alert(user.stackoverflow.name);
&#13;
如果user
是局部变量,则无法执行此操作,因为无法按名称访问本地变量。全局变量是window
对象的属性。
答案 1 :(得分:0)
我编辑了@ Barmar的代码。这将适用于局部变量:
function setPropertyValue(object, propertyPath, value) {
var properties = propertyPath.split('.');
var currentObject = object;
var length = properties.length;
var lastProperty = properties[length-1];
for (var i = 0; i < length-1; i++)
{
var property = properties[i];
if(!(property in currentObject))
{
currentObject[property] = {};
}
currentObject = currentObject[property];
}
currentObject[lastProperty] = value;
}
(function(){
var user = {};
setPropertyValue(user, "stackoverflow.name", "thomas");
alert(user.stackoverflow.name);
})();
&#13;
答案 2 :(得分:0)
你可以使用类似于使用ES6 Proxy
的语法。这样的事情可以解决问题。
function deep(obj) {
const has = ({}).hasOwnProperty.bind(obj);
return Proxy.create({
get: function(_, name) {
return deep(has(name) ? obj[name]: (obj[name] = {}));
},
set: function(_, name, value) {
obj[name] = value;
}
})
}
var user = {};
deep(user).stackoverflow.name = 'test';
deep(user).stackoverflow.site.url = 'http';
console.log(user);
但是你需要--harmony-proxies
标志。
node --harmony-proxies index.js