Как изменить свойство обьекта, зная к нему путь?
//Есть такой обьект:
var obj = {
people: {
John: {
pets:{
dog:{
name:"Umbrella",
age:12
},
cat:{
name:"Kitty",
age:5
}
}
}
}
};
//И путь к его свойству, которое надо изменить на новое:
var path=['people', 'John', 'pets', 'cat', 'name'];
var newName='Train';
//Как назначить новое имя коту? Главное - этот путь может меняться, так что нужна функция, которая автоматически будет вставлять новое значение по нужному пути.
|
|
Спасибо огромное! Все работает!
|
eval-вариант
//Есть такой обьект:
var obj = {
people: {
John: {
pets:{
dog:{
name:"Umbrella",
age:12
},
cat:{
name:"Kitty",
age:5
}
}
}
}
};
//И путь к его свойству, которое надо изменить на новое:
var path=['people', 'John', 'pets', 'cat', 'name'];
//Как назначить новое имя коту? Главное - этот путь может меняться, так что нужна функция, которая автоматически будет вставлять новое значение по нужному пути.
function getPropByPath (objectName, pathArray) {
var mas = pathArray.slice();
return eval( objectName + "." + mas.join(".") );
}
function setPropByPath (objectName, pathArray, newValue) {
var mas = pathArray.slice();
var last = mas.splice(-1, 1);
var prop = eval( objectName + "." + mas.join(".") );
return prop[last] = newValue;
}
console.log("intro: " + obj.people.John.pets.cat.name);
//movie
console.log ( getPropByPath("obj", path) );
console.log ( setPropByPath("obj", path, 'Train') );
console.log("end: " + obj.people.John.pets.cat.name);
|
bes,
:write:
eval( objectName + "['" + mas.join("']['") +"']");
|
Тоже неплохо, даже проще) Спасибо)
|
Цитата:
|
Но чаще всего.
|
| Часовой пояс GMT +3, время: 22:25. |