2014-01-20 6 views
0

У меня есть 10 массивов. Они называются resultsYEARobject, где 2002 <= YEAR <= 2011. Я хотел бы, чтобы вызвать каждый массив на основе другой переменной. Чтобы дать немного больше контекста, у меня есть раскрывающееся меню, в котором пользователь может выбрать год, который они хотели бы искать (2002-2011). Когда они нажимают кнопку «Поиск», я хочу иметь возможность искать массив результатов, относящийся к этому году.Динамически ссылочные массивы в JavaScript

Это то, что я пытаюсь выполнить (в PSEUDOCODE).

var year_choice = 2002; 
    var array_to_search = ("results" + year_choice + "object"); 
    //array_to_search would be "results2002object" 

    for(int i = 0; i < array_to_search.length; ++i) { 
     //do stuff 
    } 

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

EDIT

getScript(file_path, function(){ 
alert("found and loaded file " + file_path); 

//refine for the parameter 
var search_results = new Array(); 
for(var i = 0; i < results2002objects.length; ++i) { //go through the array in the file I want (dependant on what the user chooses in the drop down menu) 
    if(results2002objects[i].sub == selected_parameter) { 
     search_results.push(results2002objects[i]); // add the object to the array 
    } 
} 

alert("found " + search_results.length + " results with the parameter " + selected_parameter); 
for(var g = 0; g < search_results.length; ++g) { 
     $("#right_pane_results").append(search_results[g].st_id); 
} 
}); 

После того как я загрузить файл я иду через массив, как это. Вопрос не зависит от года, когда пользователь выбирает, приведенный выше код будет проходить через results2002object. Кроме того, у меня нет большого контроля над именами клавиш (array ['whatever'], поскольку данные были проанализированы с использованием программы Java, которую я сделал, и я использовал библиотеку GSON для преобразования ее в JSON.

+3

Почему вы не храните их в объекте с ключом в качестве лет – thefourtheye

+0

@thefourtheye У меня есть каждый год как отдельный файл JavaScript (данные поступают откуда-то еще), и я хотел, чтобы каждый файл был отдельно для уменьшения времени загрузки на начало. Файл 2002 года составляет 30 МБ, а все - 300 МБ. – user3210944

+0

@thefourtheye Итак, когда пользователь ищет, я загружаю этот конкретный файл за год и просматриваю массив. – user3210944

ответ

1

Таким образом, у вас есть следующие массивы:

results2002obj, results2003obj, ..., results2012obj

И вы хотите, чтобы получить доступ к ним как если бы они были массивом.

Вы можете использовать пространство имен «self». Например, results2002obj такая же, как self.results2002obj

Стоит также отметить, что в JavaScript, a.xyz является таким же, как [ «А»]

Что это означает, что вы можете относиться к любому имя переменной, как будто это ключ в массиве:

function get_results(year){ 
    return self['results'+year+'obj']; 
} 

Надеюсь, это поможет.

+0

Ничего себе, что просто смутил меня. Но я думаю, что это сработает. Благодарю. Я попробую это завтра и дам вам принятый ответ, если он сработает. – user3210944

+0

Спасибо, что работает. И это имеет большой смысл. – user3210944

2

Почему не просто создать объект и добавить элементы динамически?

var year_choice = {} 
var year_the_user_selects = "2002"; 
year_choice[year_the_user_selects] = array_you_want_here; 
+0

См. Мой ответ на thefourtheye. У меня есть каждый массив в отдельном файле и загружать его, когда мне нужно. – user3210944

+0

Да, 30 МБ большой! Ха-ха. Могу ли я увидеть код для загрузки файла? – AnalogWeapon

+0

Он также может быть массивом: 'var years = []; лет ['2002'] = ...; лет ['2003'] = ...; 'и т. д., поэтому есть удобный доступ к массивам, если это полезно. – RobG

0

не используйте цифровые клавиши в массиве, как это будет создавать 0, 1, 2, вплоть до 2002 года

Объявить карту как это:

var choices={ 
'year_2002':['option 1', 'option 2', 'option 3'], 
'year_2003':['option 1'], 
'year_2004':['option 1','option 2'], 
... 
}; 

//pick a year: 
var year=2003; 
var options = choices['year_'+year]; 
+0

Я не думаю, что это сработает для меня. У меня есть каждый год в отдельном файле. – user3210944

+0

Ваш псевдокод очень абстрактный. Я не знаю, как вы собираетесь использовать данные, и сколько у вас контроля над форматом данных и как работает сантехника. Все эти факторы влияют на формулировку вашей программы. Ум рассказать больше? Также с таким большим количеством данных файлы должны индексироваться в базе данных и обслуживаться скриптом на стороне сервера. – Schien

+0

Извините. Я не хотел давать слишком много информации, но я думаю, это было необходимо. Я добавил некоторые из моего кода в редактировании. И да, в идеале это было бы в базе данных, но сейчас у меня нет времени менять ситуацию. Это должно быть завтра. – user3210944

Смежные вопросы