Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как совместить два цикла each и for? (https://javascript.ru/forum/misc/75600-kak-sovmestit-dva-cikla-each-i.html)

kuchuluk 23.10.2018 13:29

Как совместить два цикла each и for?
 
Здравствуйте.
Работаю со строкой из таблицы, в которой много значений. Получаю значения всех ячеек в массив parentTR, получается около 33 ячеек. Также есть еще один массив fromBD.childNodes, в котором 5 значений. Нужно реализовать поочередную вставку соответствующих значений второго массива в соответствующую по порядку ячейку строки таблицы, ячейки которой в первом массиве.
Как можно это реализовать? Нужно конечно использовать цикл each, но как внутри него использовать второй цикл, тем более для короткого массива из 5-ти элементов?
Или просто через условие делать? так:
parentTR.children().each(function(i, elem) {
  if (i == 1) {
    $(elem).text(fromBD.childNodes[0].innerHTML);
  } else if (i == 2) {
    $(elem).text(fromBD.childNodes[1].innerHTML);
  } else if (i == 3) {
    $(elem).text(fromBD.childNodes[2].innerHTML);
  } else if (i == 4) {
    $(elem).text(fromBD.childNodes[3].innerHTML);
  } else if (i == 5) {
    $(elem).text(fromBD.childNodes[4].innerHTML);
  }  else if (i == 6) {
    $(elem).text(fromBD.childNodes[0].innerHTML);
  }
  // и по новой и так далее
}

Или как-то проще можно объединить два цикла, чтобы не писать условия по 33 раза?

Dilettante_Pro 23.10.2018 13:38

kuchuluk,
Вы уверены, что так?
if (i == 1) {
    $(elem).text(fromBD.childNodes[0].innerHTML);[b]kuchuluk[/b],

а где i == 0?

Dilettante_Pro 23.10.2018 13:47

parentTR.children().each(function(i, elem) {
    var j = i - Math.floor(i / 5 ) * 5;
    $(elem).text(fromBD.childNodes[j].innerHTML);
 }

Где j - вот такое
for(var i = 0; i < 33; i++) {
alert(i - Math.floor(i / 5 ) * 5);
}

kuchuluk 23.10.2018 13:47

Цитата:

Сообщение от Dilettante_Pro (Сообщение 496895)
а где i == 0?

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

kuchuluk 23.10.2018 13:52

Цитата:

Сообщение от Dilettante_Pro
for(var i = 0; i < 33; i++) {
alert(i - Math.floor(i / 5 ) * 5);
}

Этот цикл получается запускать до цикла each? Или в его теле?

Dilettante_Pro 23.10.2018 14:06

Цитата:

Сообщение от kuchuluk
Этот цикл получается запускать до цикла each? Или в его теле?

Это просто иллюстрация.
Весь ваш цикл выше.
Если пропускать первую ячейку, то ваш скрипт

parentTR.children().each(function(i, elem) {
   if(i > 0) {
      var j = i - Math.floor((i - 1) / 5 ) * 5 - 1;
      $(elem).text(fromBD.childNodes[j].innerHTML);
   }
 }

Aetae 23.10.2018 16:16

%

Dilettante_Pro 23.10.2018 18:15

Aetae,
Да, так проще
parentTR.children().each(function(i, elem) {
   if(i > 0) {
      var j =(i - 1) % 5 ;
      $(elem).text(fromBD.childNodes[j].innerHTML);
   }
 }

kuchuluk 25.10.2018 12:03

А как-нибудь можно улучшить, чтобы если какой-то из элементов первого массива (то есть elem) равен какому-нибудь значению, то чтобы в эту ячейку ничего не вставлялось и чтобы дальнейшая вставка происходила в следующую за ней ячейку, но с того элемента массива fromBD.childNodes[j], который должен был вставиться в ту ячейку, в которую ничего вставлено не было.
Если делаю так:
if (i > 3) {
  if (elem.innerHTML == 'В') {
    return;
  }
  var j =(i - 4) % 5;
  $(elem).text(fromBD.childNodes[j].innerHTML);
}

То в эту ячейку ничего не добавляется, но в следующую вставляется значение уже следующего элемента массива fromBD.childNodes, а не того, который был пропущен


Часовой пояс GMT +3, время: 14:38.