zorro76
@zorro76

Как этот код можно оптимизировать (сократить)?

Есть функция (которая валидирует много чего) - меня ж интересует два куска практически идентичного кода, который проходиться for по группе с checkbox и выводит сообщения с перечнем ошибок для каждой группы отдельное

function populateErrors() {
        var reasons = [];
        var dragdropChoices = $('.drag-and-drop .choices');
        for (var c = 0; c < dragdropChoices.length; c++)
           if ($(dragdropChoices[c]).find('input:checkbox:checked').length == 0) {
               reasons.push('select at least one correct answer for each <b>drag & drop</b> question');
           }

        var multipleChoices = $('.multiple-choice .choices');
        for (var c = 0; c < multipleChoices.length; c++)
           if ($(multipleChoices[c]).find('input:checkbox:checked').length == 0) {
               reasons.push('select at least one correct answer for each <b>multiple choice</b> question');
           }

        return _.uniq(reasons);
    }

разметка HTML/Ruby
<div class="activity-content">
  <div class="activity-content-item drag-and-drop" id="drag-editor71815805" data-id="46">
    <p>Enter answer options:</p>
    <div class="choices">

  <div class="choice">
    <div class="checkbox-switch-wrapper">
      <div class="checkbox-switch "><span></span></div>
      <input type="checkbox" value="1" name="activity[item_attributes][questions_attributes][][content][choices][][correct]">
    </div>&nbsp;
  </div>


  <div class="choice">
    <div class="checkbox-switch-wrapper">
      <div class="checkbox-switch "><span></span></div>
      <input type="checkbox" value="1" name="activity[item_attributes][questions_attributes][][content][choices][][correct]">
    </div>&nbsp;
  </div>


  <div class="choice">
    <div class="checkbox-switch-wrapper">
      <div class="checkbox-switch "><span></span></div>
      <input type="checkbox" value="1" name="activity[item_attributes][questions_attributes][][content][choices][][correct]">
    </div>&nbsp;
  </div>
</div>
</div>

  <div class="activity-content-item multiple-choice" id="choice-editor6345333" data-id="47">
    <p>Enter answer options:</p>
    <div class="choices">

  <div class="choice">
    <div class="checkbox-switch-wrapper">
      <div class="checkbox-switch "><span></span></div>
      <input type="checkbox" value="1" name="activity[item_attributes][questions_attributes][][content][choices][][correct]">
    </div>&nbsp;
  </div>


  <div class="choice">
    <div class="checkbox-switch-wrapper">
      <div class="checkbox-switch "><span></span></div>
      <input type="checkbox" value="1" name="activity[item_attributes][questions_attributes][][content][choices][][correct]">
    </div>&nbsp;
  </div>


  <div class="choice">
    <div class="checkbox-switch-wrapper">
      <div class="checkbox-switch "><span></span></div>
      <input type="checkbox" value="1" name="activity[item_attributes][questions_attributes][][content][choices][][correct]">
    </div>&nbsp;
  </div>
</div>
</div>
</div>


как сократить этот повторяющийся код?
  • Вопрос задан
  • 60 просмотров
Решения вопроса 1
Не вижу, что тут радикально плохое.
JS можно сократить:
const dragndropReasons = $('.drag-and-drop .choices')
    .filter(c => c.find('input:checkbox:checked').length == 0)
    .map(() => 'select at least one correct answer for each <b>drag & drop</b> question');
const multipleReasons = $('.multiple-choice .choices')
    .filter(c => c.find('input:checkbox:checked').length == 0)
    .map(() => 'select at least one correct answer for each <b>multiple choice</b> question');
return _.uniq(dragndropReasons.concat(multipleReasons))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Simkav
@Simkav
На вход передаете свои массивы по одному
function foo(array) {
  for (let i = 0; i < array.length; i++) {
    if ($(array[c]).find('input:checkbox:checked').length === 0) {
      reasons.push(
        'select at least one correct answer for each <b>multiple choice</b> question'
      );
    }
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы