2012-03-20 53 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