Задать вопрос
bogdan_uman
@bogdan_uman
шлЫмазл неукЪ-поцЪ

Объединить два цикла по условию?

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

const arr = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]];

const result = [];
for (let i = 0; i < arr.length; ++i) {
  if (i % 2) {
    for (let j = 0; j < 3; ++j) result.push(arr[i][j]);
  } else {
    for (let j = 2; j >= 0; --j) result.push(arr[i][j]);
  }
}

console.log(result);


Спасибо.
  • Вопрос задан
  • 586 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Не надо ничего объединять, нет необходимости использовать циклы в явном виде:

const result = arr.flatMap((n, i) => i & 1 ? n : [...n].reverse());

Если всё-таки нужны именно вложенные циклы, то

const result = [];
for (let i = 0; i < arr.length; ++i) {
  const a = i & 1 ? arr[i] : [...arr[i]].reverse();
  for (let j = 0; j < a.length; ++j) {
    result.push(a[j]);
  }
}

UPD. Вынесено из комментариев:

мне как бы очень важна производительность, и reverse() это как бы дополнительная операция

Окей, вот никаких reverse'ов:

const result = arr.reduce((acc, n, i) => (
  i & 1
    ? acc.push(...n)
    : n.reduceRight((_, m) => acc.push(m), null),
  acc
), []);

// или

const result = [];
for (const [ i, n ] of arr.entries()) {
  const [ start, end, step ] = [
    [ n.length,       -1, -1 ],
    [       -1, n.length,  1 ],
  ][i & 1];

  for (let j = start; (j += step) !== end;) {
    result.push(n[j]);
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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