2014-10-23 2 views
1

В нескольких местах у меня есть петли над предопределенным набором значений.Зацикливание по некоторым жестко закодированным данным

Мой текущий код:

for (var period in {'today':true,'yesterday':true,'this week':true,'last week':true,'this month':true,'last month':true}) { 
    ...  
} 

Он работает, но есть симпатичнее способ сделать это?

(period потребности, чтобы быть значения, а не индекс, в противном случае я бы использовать массив.)

+0

Возможный дубликат [Итерирование над массивом в JavaScript] (http://stackoverflow.com/questions/5167323/iterating-over-an-array-in-javascript) – simonzack

+1

Я не думаю, что это обман, поскольку речь идет конкретно о буквальных значениях, которые предотвращают (или, по крайней мере, усложняют) использование старого стандарта 'for (i in varname) {item = varname [i]; ...}' idiom. –

+0

Нет, это не дуп, я хочу, чтобы период последовательно содержал значения «сегодня», «вчера» и т. Д. – fadedbee

ответ

2

Да, при условии, что вам не нужно беспокоиться о старых двигателях JavaScript (как IE < = 8):

['today','yesterday','this week','last week', 
'this month','last month'].forEach(function(period) { 
... 
}) 
+0

Почему downvote? Этот ответ правильный! –

+0

OP говорит: «(период должен быть значением, а не индексом, иначе я бы использовал массив.)» – simonzack

+1

И в приведенном выше коде 'period' - это значение, а не индекс. Проблема заключается не в использовании массива * per se *; проблема заключается в том, что 'for varname in array' устанавливает' varname' в индексы, а не в значения. 'forEach' не разделяет эту проблему. –

1

способ сделать это в ES6 является:

for (var period of ['today', 'yesterday', 'this week', 'last week', 'this month', 'last month']) { 
    // ...   
} 

Это поддерживается в Firefox. Если вы не поддерживаете JS-движок, то используйте транспилятор ES6 или вам нужно отступить к более старым решениям.

+0

В JavaScript нет петель 'for''. –

+1

@MarkReed Спасибо, я немного изменил свой тон в ответе. Возможно, было недоразумение. – simonzack

1

Я хотел бы сделать это:

var timePeriod = [ "today" 
       , "yesterday" 
       , "this week" 
       , "last week" 
       , "this month" 
       , "last month" 
       ]; 

for (var i in timePeriod) { 
    with ({ period: timePeriod[i] }) { 
     ... 
    } 
} 

Это имеет два преимущества по сравнению с @ MarkReed, решение которого:

  1. Это работает во всех браузерах.
  2. Это быстрее, потому что функция никогда не называется.

Кроме того, использование инструкции with предотвращает неполадочную проблему с замкнутым контуром.

+0

Ваш второй пункт неверен. Мое решение не вызывает никакой функции. – simonzack

+0

Я не сравнивал свое решение с вашим. –

+0

Вы говорите «другие решения», которые включают в себя все, кроме вас. – simonzack

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