想象一下,我有一些javascript对象,例如var person = {};
我得到一个字符串,表示对该对象的虚线遍历,例如“Address.Suburb”
和另一个表示要设置的值的字符串。例如“你的城镇”
启用此功能的一般功能是什么。在调用之前,属性可能存在也可能不存在,函数将需要 必要时创建属性。
function MySetter(object, stringTraversal, valueToSet) {
....
}
这样
var person = {};
MySetter(person, "Address.Suburb", "CrazyTown")
alert(person.Address.Suburb); // alerts CrazyTown
感谢。
答案 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