Как получить значение переменной/свойства объекта, зная ее имя?
Есть некоторая функция someFunction(x) , где x - строка имени переменной/свойства объекта. Есть следующий код:
var test = 123; var object = { prop: 100 }; function someFunction(x) { var xValue = eval(x); alert(x + " = " + xValue); } someFunction("test"); // alert("test = 123"); someFunction("object.prop"); // alert("object.prop = 100"); Можно ли для получения значения x использовать что-нибудь "лучше" eval()? Везде говорят избегать его использования. В общем хотелось бы увидеть хорошее решение без использования eval(). |
Sinist3r,
:-? var test = 123; var object = { prop: 100 }; function someFunction(x) { var a = x.split('.'); var xValue = window[a[0]]; for (var i=1; i<a.length; i++) {xValue = xValue[a[i]]} alert(x + " = " + xValue); } someFunction("test"); // alert("test = 123"); someFunction("object.prop"); // alert("object.prop = 100"); |
Я забыл указать, что object может быть абсолютно любым, в т.ч. содержать массивы, которые в свою очередь могут содержать объекты и т.п. Поэтому, к примеру, такой вариант не пройдет:
var object = { props: [ {num: "one"}, {num: "two"}, {num: "three"}, {num: "four"} ] }; function someFunction(x) { var a = x.split('.'); var xValue = window[a[0]]; for (var i=1; i<a.length; i++) {xValue = xValue[a[i]]} alert(x + " = " + xValue); } alert(object.props[2].num); // "three" someFunction("object.props[2].num"); // TypeError: xValue is undefined |
если есть только "хорошие" свойства и индексы массива, то внутри функции меняем строчку на
var a = x.split(/\.|\[|\]\[?\.?/) если будут конструкции типа obj["abc'd\"ef"], то придется разбираться с кавычками. |
Яростный Меч,
Спасибо, теперь все отлично. |
Часовой пояс GMT +3, время: 15:53. |