![](/img/trans.png)
[英]javascript create nested object variable for saving from dotted representation
[英]Create javascript object using dotted string
假設我有一些javascript對象,例如var person = {};
我得到了一個字符串,該字符串表示對該對象的虛線遍歷,例如“ Address.Suburb”
另一個字符串表示要設置的值。 例如“您的小鎮”
有什么通用功能可以設置此功能。 這些屬性在調用之前可能存在也可能不存在,如果需要,函數將需要創建屬性。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.