直接设置深层财产的方法

时间:2015-07-17 05:25:09

标签: javascript object properties

我想设置变量user.stackoverflow.name,而这正是我想用它创建的。我可以使用完整变量创建深度属性吗?我知道npm module dotty允许您使用这样的字符串设置深度属性。

dotty.put(user, "stackoverflow.name", "thomas")

我真的希望能够设置这样的深层属性。

user.stackoverflow.name = "thomas"

createDeep(user.stackoverflow.name, "thomas")

如有必要,创建嵌套对象。

这可能吗?

3 个答案:

答案 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;
&#13;
&#13;

如果user是局部变量,则无法执行此操作,因为无法按名称访问本地变量。全局变量是window对象的属性。

答案 1 :(得分:0)

我编辑了@ Barmar的代码。这将适用于局部变量:

&#13;
&#13;
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;
&#13;
&#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