2015-10-18 2 views
1

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

Вот сценарий: У меня есть тонны if заявлений пытаются сделать что-то вроде кода ниже:

var wv == today.getDate(); 

if(wv == 0){ 
wv0.forEach(function(entry, index)... 

if(wv == 1){ 
wv1.forEach(function(entry, index)... 

if(wv == 2){ 
wv2.forEach(function(entry, index)... 

Проблема заключается в том, что все, что приходит после wvX.forEach является одинаковым для каждого блока кода. Таким образом, я знаю, что это может быть сжато, но я не знаю, как это сделать.

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

var daycode = 'wv' + getDate(); 

Теперь это дает мне его (так что сегодня, в воскресенье, он вернется wv0, но когда я пытаюсь конденсироваться выше примерно так:

if (wv == 0) 
daycode.forEach(function(entry, index)... 

даже это не работает, я знаю, что это будет работать только для wv == 0 или воскресенье, но он по-прежнему не работает. Однако

if (wv == 0) 
wv0.forEach(function(entry, index)... 

все еще работает, даже если это то же самое, что и блок кода над ним, как daycode = wv0.

Редактировать: поэтому я только что понял. Вероятно, потому, что daycode рассматривается как переменная. Например, хотя wv0.length возвращает 1, daycode.length возвращает 3, поскольку значение daycode составляет wv0, а длина wv0 - это три. Как же тогда я могу это сделать?

+0

Откуда берутся значения в 'wv0',' wv1', ...? Дальше «тонна заявлений» звучит тревожно для меня, вы должны изменить это (может быть, ответ может направить вас). Что такое код после тех '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''} '' '' '' '' '' '' - Каковы петли, которые делают внутри? –

+0

вы можете использовать только массив для функций 'wv0, wv1' и т. Д., И просто получить его по индексу – Grundy

ответ

0

Вы можете сделать что-то подобное, что, я думаю, идиоматично и не прибегает к eval.

var f = function(entry, index){ ... }; 
var mappings = { 0: wv0, 1: wv1...}; 
var wv = today.getDate(); 
mappings[wv].forEach(f); 

Явное отображение результата даты в объекты, которые вы хотите перебрать.

+0

TY! Я убивал время своим телефоном :). –

+0

Это должно быть двоеточие вместо запятой в ваших отображениях от 0 до wv0 – geckob

+0

Это. Я сделал бы это точно так же, без уродливого eval и повторного кода (не так уж много). – Shanoor

-1

Вы можете объявить функцию внутри переменной и передать ее методу forEach.

var doThis = function(entry, index { 
    // Do something 
} 

if (wx == 0) { 
    wx3.forEach(doThis) 
} 

Это очень опасный метод и убедитесь, что вы знаете, что вы делаете. Используйте метод eval.

eval(fname)(arg1, arg2); 

Если у вас есть это заявление:

var arr = [1,4,5,6] 

Вы можете использовать Eval:

eval('arr') 

Он вернется [1,4,5,6] даже вы буквально передавая строку

Таким образом, вы может создать функцию, которая принимает параметр строки, которая связана с массивом, который вы повторяются.

var iterate = function(arrName) { 
    var arr = eval('arrName'); 
    arr.forEach(......) 

Для оператора if, возможно, вы можете рассмотреть использование оператора switch для упрощения кода.

+0

Спасибо за ответ! К сожалению, я не знаю, как это реализовать. Я попытался сделать это: 'var daycode = eval (" 'wv' + getDate() ")', но он все еще не работает. 'daycode.length' по-прежнему возвращает 3, хотя возвращается' wv0.length' 2. Edit: Я смотрю ваше редактирование прямо сейчас. –

+0

И какой должен быть дневной код? – geckob

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