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

Create javascript object using dotted string

本文关键字:javascript 对象 创建 字符串 虚线      更新时间:2023-09-26

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

我得到了一个字符串,它表示对该对象的点遍历,例如"Address.Suburb"

以及表示要设置的值的另一个字符串。例如"Your Town"

可以设置的通用功能是什么。在调用之前,属性可能存在,也可能不存在,函数需要以在必要时创建属性。

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

使得

var person = {};
MySetter(person, "Address.Suburb", "CrazyTown")
alert(person.Address.Suburb); // alerts CrazyTown

谢谢。

尝试:

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

很抱歉命名不正确

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

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

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);
    }
}

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

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];
    }
}

像这样的东西(没有时间测试)。

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