Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.09.2013, 19:17
Новичок на форуме
Отправить личное сообщение для Sinist3r Посмотреть профиль Найти все сообщения от Sinist3r
 
Регистрация: 19.09.2013
Сообщений: 5

Как получить значение переменной/свойства объекта, зная ее имя?
Есть некоторая функция 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().
Ответить с цитированием
  #2 (permalink)  
Старый 19.09.2013, 19:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

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");
Ответить с цитированием
  #3 (permalink)  
Старый 19.09.2013, 20:08
Новичок на форуме
Отправить личное сообщение для Sinist3r Посмотреть профиль Найти все сообщения от Sinist3r
 
Регистрация: 19.09.2013
Сообщений: 5

Я забыл указать, что 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
Ответить с цитированием
  #4 (permalink)  
Старый 19.09.2013, 20:34
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

если есть только "хорошие" свойства и индексы массива, то внутри функции меняем строчку на
var a = x.split(/\.|\[|\]\[?\.?/)


если будут конструкции типа obj["abc'd\"ef"], то придется разбираться с кавычками.
Ответить с цитированием
  #5 (permalink)  
Старый 19.09.2013, 20:39
Новичок на форуме
Отправить личное сообщение для Sinist3r Посмотреть профиль Найти все сообщения от Sinist3r
 
Регистрация: 19.09.2013
Сообщений: 5

Яростный Меч,
Спасибо, теперь все отлично.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение от вызываемой функции? Dimaz Общие вопросы Javascript 6 08.12.2012 20:42
Как получить имя текущего файла Andrey_szr Элементы интерфейса 3 08.10.2012 10:18
Как получить значение переменной из callback функции? Хиросим AJAX и COMET 5 24.04.2012 09:32
Как получить значение следующего элемента? _mouse_ Общие вопросы Javascript 4 25.02.2010 11:37