Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как изменить свойство обьекта, зная к нему путь? (https://javascript.ru/forum/misc/51790-kak-izmenit-svojjstvo-obekta-znaya-k-nemu-put.html)

Sektoid 19.11.2014 23:18

Как изменить свойство обьекта, зная к нему путь?
 
//Есть такой обьект:

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

//Как назначить новое имя коту? Главное - этот путь может меняться, так что нужна функция, которая автоматически будет вставлять новое значение по нужному пути.

рони 19.11.2014 23:51

Sektoid,
http://javascript.ru/forum/misc/3512...tml#post230733

Sektoid 20.11.2014 01:46

Спасибо огромное! Все работает!

bes 20.11.2014 02:53

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

рони 20.11.2014 03:10

bes,
:write:
eval( objectName + "['" + mas.join("']['") +"']");

Sektoid 21.11.2014 19:40

Тоже неплохо, даже проще) Спасибо)

bes 21.11.2014 19:42

Цитата:

Сообщение от Sektoid
Тоже неплохо, даже проще) Спасибо)

короткий код не всегда лучше ;)

Erolast 21.11.2014 20:16

Но чаще всего.


Часовой пояс GMT +3, время: 17:24.