2012-03-20 60 views
1

想象一下,我有一些JavaScript对象,例如var person = {};使用虚线创建JavaScript对象

,我给代表一个点穿越到该对象,例如“Address.Suburb”

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

什么是通用函数来设置它。这些属性在调用之前可能存在也可能不存在,如果需要,函数将需要 来创建属性。

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

这样

var person = {}; 

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

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

感谢。

回答

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

编辑::我误会了,我认为这个问题。这将返回字符串路径中的值,并且您想要设置它?

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

这样的事情(没时间去测试它)。

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