цикл внутри цикла в javascript

#javascript #coffeescript

#javascript #coffeescript

Вопрос:

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

это действительные дни [ 'Monday', 'Thursday', 'Friday', 'Sunday' ]

и это действительные даты

 [ Sun Oct 09 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Mon Oct 10 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Tue Oct 11 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Wed Oct 12 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Thu Oct 13 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Fri Oct 14 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Sat Oct 15 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Sun Oct 16 2016 05:00:00 GMT 0500 (Pakistan Standard Time) ]
 

Что я хочу сделать, так это: найти только те даты, которые равны количеству дней

То, что я делаю, это:

 _valid_dates = (dates, days) ->
  validDates = dates
  dates.forEach (date) ->
    days.forEach (day) ->
      if moment_strf(date).strftime("%A") != day
        validDates.remove date
      else
        console.log "Am valid day", moment_strf(date).strftime("%A")

  validDates
 

Но результаты получаются не такими, как я ожидаю. Согласно данным, оставшиеся даты должны быть

 [ Sun Oct 09 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Mon Oct 10 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Thu Oct 13 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Fri Oct 14 2016 05:00:00 GMT 0500 (Pakistan Standard Time),
  Sun Oct 16 2016 05:00:00 GMT 0500 (Pakistan Standard Time) ]
 

Любая помощь будет оценена! Спасибо

Комментарии:

1. Что такое moment_strf и validDates.remove ?

2. Сколько записей у вас есть в вашем результирующем наборе? Это всегда одно и то же или нет? Как заполняются ваши результаты?

3. validDates = dates является неглубокой копией (т. Е. Копируется только ссылка, а не то, на что она указывает), поэтому, возможно, вы попадаете в старую ловушку «удаление из массива во время итерации по нему». Вероятно, вам было бы лучше составить отдельный список того, что вы хотите, и оставить аргументы в покое.

4. Moment strf перенимается из momentjs. И .romove — это метод удаления массива со значением

5. Я спросил, потому что нигде не мог найти никакой документации для этих двух функций. В любом случае, если рекомендация @muistoosh не работает, вам, вероятно, следует углубиться в эти функции.

Ответ №1:

Вы можете сделать это просто, используя только javascript:

Вместо того, чтобы брать полные имена в массиве day, вы можете использовать 0-6 для days, а затем

     //sunday=0,monday=1 ....saturday=6
     var days=[1,4,5,0];
     var result_arr=[]; // required array for result
     for(date in dates)
     {
        if(days.indexOf(new Date(date).getDay())!=-1)
         {
             result_arr.push(date);
         }
      }
 

Комментарии:

1. @JunaidFarooq, я думаю, что то, что вы хотите получить с помощью приведенного выше кода, — это действительные даты (у которых есть дни, доступные в массиве days [‘Понедельник’, ‘четверг’, ‘Пятница’, ‘Воскресенье’ ]), поэтому, если я правильно понял, мой код будет работать правильно, и если ваш вопрос отличается, пожалуйста очистите его. Спасибо