使用虚线字符串创建javascript对象

时间:2012-03-20 07:21:15

标签: javascript

想象一下,我有一些javascript对象,例如var person = {};

我得到一个字符串,表示对该对象的虚线遍历,例如“Address.Suburb”

和另一个表示要设置的值的字符串。例如“你的城镇”

启用此功能的一般功能是什么。在调用之前,属性可能存在也可能不存在,函数将需要 必要时创建属性。

function MySetter(object, stringTraversal, valueToSet) {
    ....
}

这样

var person = {};

MySetter(person, "Address.Suburb", "CrazyTown")

alert(person.Address.Suburb); // alerts CrazyTown

感谢。

5 个答案:

答案 0 :(得分:1)

尝试:

function setObjPath(obj,path,value){
  var parts = path.split('.'), part;

  function error(txt){
      throw new TypeError(txt);
  }

  while (part = parts.shift()){
    if (parts.length){
        obj = part in obj && obj[part] instanceof Object 
              ? obj[part] 
              : part in obj 
                ? error('key ['+part+'] exists but is not an object') 
                : (obj[part] = {}, obj[part]);
    } else {
       obj[part] = value;
    }
  }
}
// usage examples
var person = {name: {prename: {first:'Pete',full:'Pete Michael'}}};

setObjPath(person, 'name.surname.first','Johansen');
alert(person.name.prename.first +' '+person.name.surname.first);
 //=> Pete Johansen

setObjPath(person, 'name.prename.first','George');
alert(person.name.prename.first+' '+person.name.surname.first);
 //=> George Johansen

setObjPath(person, 'name.prename.first.isset',true);
 //=> throws TypeError

答案 1 :(得分:0)

抱歉命名不佳

function MySetter(obj, path, value){
      var paths = path.split(".");
      var path;
      var ans;
      for(var i in paths) {
                obj = obj[paths[i]];
      };
      return ans;
}

编辑::我误解了我的想法。这将返回字符串路径中的值,并且您想要设置它吗?

答案 2 :(得分:0)

function MySetter(object, string, value) {
    if (typeof string === 'string') {
        string = string.split('.');
    }

    if (typeof object[string[0]] === 'object')
        return MySetter(object[string[0]], string.slice(1), value);
    else
        return object[string[0]];
}

这应该可以做到!

编辑:是的,我也误解了它......

function MySetter(object, string, value) {
    if (typeof string === 'string') {
        string = string.split('.');
    }

    if (string.length === 2) {
        object[string[1]] = value;
    } else {
        return MySetter(object[string[0]], string.slice(1), value);
    }
}

答案 3 :(得分:0)

您可以尝试编写自己的解析器。

function MySetter(object, stringTraversal, valueToSet) {
    var prop = stringTraversal.split('.'),
        len = prop.length,
        obj = object,
        attr = null;
    for (var i = 0; i < len; i++) {
         attr = prop[i];
         if (i == len - 1) {
             obj[attr] = valueToSet;
             return;
         }
         if (!obj[attr] && i < len - 1) {
             obj[attr] = {};
         }
         obj = obj[attr];
    }
}

像这样(没时间测试)。

答案 4 :(得分:0)

function MySetter(object, stringTraversal, valueToSet) {
    var pieces = stringTraversal.split('.');

    for(var i in pieces) {
        var val = {};
        if(i == pieces.length-1) {
            val = valueToSet;
        }
        object[pieces[i]] = val;
        object = object[pieces[i]];
    }
}

var person = {};

MySetter(person, "Address.Suburb", "CrazyTown")

alert(person.Address.Suburb); // alerts CrazyTown