Задать вопрос
@ParaBellum577

Как соединить 2 массива чередуя элементы через 5?

Есть 2 массива, как можно сделать слияние таким образом, чтобы элементы чередовались каждый 5-й?
const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
  const b = ["a", "b", "c", "d"];

На выходе должно быть вот так.
const с = [ "a", 1, 2, 3, 4,5, "b",6, 7, 8, 9, 10, "c",11, 12, 13, 14, 15, "d"];

Есть вот такая функция, однако она модифицирует исходные массивы, такой вариант не подходит, очень много данных надо перебирать.
const merge = (b, a) => {
            for (var i = 0; a.length; ) b.splice(i++ * 5, 0, a.shift());
            return b;
          }

Если есть вариант решения с использованием _lodash, будет круто)
  • Вопрос задан
  • 261 просмотр
Подписаться 1 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Вот несколько вариантов (есть и ещё; понятно, что выдумывать все возможные я не буду, как и не буду реализовывать все выдуманные):

const merge = (arr1, arr2, step) => Array
  .from(
    { length: Math.min(arr1.length, 1 + arr2.length / step | 0) },
    (_, i) => [ ...arr2.slice(~-i * step, i * step), arr1[i] ]
  )
  .flat();

или

const merge = (arr1, arr2, step) =>
  [].concat(...Array.from(
    { length: Math.min(arr1.length, 1 + arr2.length / step | 0) },
    (_, i) => [ arr1[i], ...arr2.slice(i * step, -~i * step) ]
  ));

или

const merge = (arr1, arr2, step) =>
  Array.prototype.flatMap.call(arr1, (n, i) => [
    ...Object.assign(
      i ? Array(step).fill(null) : [],
      arr2.slice((i - 1) * step, i * step)
    ),
    n,
  ]);

или

function merge(arr1, arr2, step) {
  const len = arr2.length;
  return Array.from(
    { length: len - (len % step) + 1 + len / step | 0 },
    (_, i) => {
      const j = i / (step + 1) | 0;
      return i % (step + 1)
        ? arr2[i - j - 1]
        : arr1[j] ?? null
    });
}

Для вашего случая - const c = merge(b, a, 5); - можете воспользоваться любой из этих функций, результаты выдадут одинаковые. Чего может и не быть с другими аргументами. Например:

Во втором массиве недостаточно элементов:

merge('ABCD', [ 1, 2, 3, 4, 5, 6, 7 ], 4)

// первая и четвёртая функции останавливаются на элементе первого массива,
// если во втором массиве не хватает элементов, на заполнение
// очередного промежутка между элементами первого массива
['A', 1, 2, 3, 4, 'B']

// вторая функция остановится после того,
// как отдаст все элементы второго массива
['A', 1, 2, 3, 4, 'B', 5, 6, 7]

// третья функция подставит дефолтные значения
// вместо недостающих элементов второго массива
['A', 1, 2, 3, 4, 'B', 5, 6, 7, null, 'C', null, null, null, null, 'D']

Или, в первом массиве недостаточно элементов:

merge('ABC', [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], 2)

// 1, 3
['A', 1, 2, 'B', 3, 4, 'C']

// 2
['A', 1, 2, 'B', 3, 4, 'C', 5, 6]

// 4
['A', 1, 2, 'B', 3, 4, 'C', 5, 6, null, 7, 8, null]
Ответ написан
Комментировать
@Sun_Day
const step = 5;
const c = [];
for (let x = 0, y = 0; x <= a.length; x += step, y += 1) {
    c.push(...a.slice(x - step, x).concat(b[y]));
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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