Использование строки для нацеливания на объект - PullRequest
0 голосов
/ 14 ноября 2010

Я относительно новичок в JavaScript. Я использую титановый SDK appcelerator для создания мобильного приложения, и оно использует только javascript.

В любом случае, у меня есть система меню иерархии, которую я создаю. У меня есть массивы данных, заполненные элементами подменю. Каждый массив данных заполнен различным подменю. Когда я нажимаю на пункт меню, он получает переменную, которая позволяет приложению узнать, какой массив данных загрузить следующим. Вот базовый пример:

 var data = [
    {title:'Item 1',subID:'1', hasDetail:true,},
    {title:'Item 2',subID:'1', hasDetail:true,}
 ];

 var data1 = [
  {title:'Child1',subID:'1_1', hasDetail:true},
  {title:'Child2', subID:'1_2', hasDetail: true}
 ];

 var data1_1 = [
   {title:'Grandchild1'},
   {title:'Grandchild2'}
  ];

    // I have a ton of menu items though, so the method I'm using 
    // below is very inefficient:
    if(win.subID == '1'){
       tableview.setData(data1);
    } else if(win.subID == '2'){
       tableview.setData(data2);
    }

Есть еще много меню (1,2,3,4 и т. Д. И 1_1,1_2,1_3,2_1,2_2 и т. Д.), Поэтому описанный выше способ установки данных крайне неэффективен. То, что я хотел бы, так что-то вроде этого:

tableview.setData(data + win.subID);

Однако я знаю, что данные - это объект массива, а subID - это строка. Как я могу объединить имя объекта со строкой, а затем преобразовать его, чтобы снова обратиться к объекту?

Спасибо, и, пожалуйста, дайте мне знать, если что-то выше неясно. Я боролся с этим очень долго.

EDIT:

Вот что мне нужно в других словах:

У меня есть строка, которую я хочу использовать для ссылки на массив.

data1 = [
   {value: 1},
   {value: 2}
]
var string = 'data1';
magicStringToArrayFunction(string);
tableview.setData(string);

Мне нужна эта магическая строка для функции массива / объекта.

Ответы [ 3 ]

1 голос
/ 19 ноября 2010

Я не знаю достаточно титана, чтобы ответить на него напрямую, но вот подсказка.Какой глобальный объект в титане?Вы знаете, если вы объявляете глобальную переменную, к какому объекту принадлежит эта переменная?

В среде браузера глобальным объектом является окно.Использование глобальной переменной или вызов глобальной функции фактически обеспечивает доступ к свойствам и вызовам методов объекта окна.Итак, в веб-браузере:

setTimeout(foo, 10)
// is the same as:
window.setTimeout(foo, 10)
// is the same as:
window['setTimeout'](foo,10)

и

x = 5
// is the same as:
window.x = 5
// is the same as:
window['x'] = 5

Так что в вашем случае, если бы это был обычный веб-браузер, ваш код был бы:

var string = 'data1';
tableview.setData(window[string]);

Однако не все реализации javascript работают таким образом, это работает во всех известных веб-браузерах с поддержкой javascript.Не знаю, сможете ли вы сделать это из титана.

0 голосов
/ 19 ноября 2010

Возможно, есть более элегантный способ сделать это, но я устал:] Но вы можете использовать хеш-таблицы в качестве решения

Хеш-таблицы Javascript

var myArray = new Array();
myArray['data1_1'] = data1_1;
myArray['data1'] = data1;
myArray['data'] = data;

var thestring='data1';
tableview.setData(myArray[thestring]);

Нечто подобное может сработать.

0 голосов
/ 14 ноября 2010

Я думаю, что вы хотите массив массивов, так что вы можете сделать это ...

tableView.setData(data[win.subID]);
...