Слияние двух массивов с переменными значениями

Я хотел бы объединить 2 массива с другой длиной:

let array2 = ["a", "b", "c", "d"];
let array2 = [1, 2];

let outcome = ["a",1 ,"b", 2, "c", "d"] 

Каков наилучший способ сделать это?

Изменить: Я ожидаю, что результат будет ["a", 1 ,"b", 2, "c", "d"]

Ответ 1

Вы можете выполнить итерацию минимальной длины массива и построить альтернативные элементы, а в конце нажать остальные.

var array1 = ["a", "b", "c", "d"],
    array2 = [1, 2],
    result = [],
    i, l = Math.min(array1.length, array2.length);
    
for (i = 0; i < l; i++) {
    result.push(array1[i], array2[i]);
}
result.push(...array1.slice(l), ...array2.slice(l));

console.log(result);

Ответ 2

Вот другой способ, которым вы можете сделать это, используя назначение деструктурирования -

const interleave = ([ x, ...xs ], ys = []) =>
  x === undefined
    ? ys                             // base: no x
    : [ x, ...interleave (ys, xs) ]  // inductive: some x
        
console.log (interleave ([0, 2, 4, 6], [1, 3, 5])) // [ 0 1 2 3 4 5 6 ]    
console.log (interleave ([0, 2, 4], [1, 3, 5, 7])) // [ 0 1 2 3 4 5 7 ]
console.log (interleave ([0, 2, 4], []))           // [ 0 2 4 ]
console.log (interleave ([], [1, 3, 5, 7]))        // [ 1 3 5 7 ]
console.log (interleave ([], []))                  // [ ]

Ответ 3

Создайте массив кортежей. Каждый кортеж содержит 1 элемент из каждого массива, сглаживается путем распространения массива кортежей и добавления оставшихся элементов из массивов:

const a1 = ["a", "b", "c", "d"];
const a2 = [1,2];
const l = Math.min(a1.length, a2.length);

const merged = [].concat(...Array.from({ length: l }, (_, i) => [a1[i], a2[i]]), a1.slice(l), a2.slice(l));
  
console.log(merged);

Ответ 4

Вот современное решение, которое принимает любое количество массивов:

const braidArrays = (...arrays) => {
  const braided = [];
  for (let i = 0; i < Math.max(...arrays.map(a => a.length)); i++) {
    arrays.forEach((array) => {
      if (array[i] !== undefined) braided.push(array[i]);
    });
  }
  return braided;
};

Обратите внимание, что вы можете изменить Math.max на Math.min, чтобы он включал только самый короткий массив.

Вот пример ввода/вывода:

braidArrays(['a','b','c','d'], [1,2,3], [99,98,97,96,95]);
// ['a', 1, 99, 'b', 2, 98, 'c', 3, 97, 'd', 96, 95]

Ответ 5

ONELINER: я предполагаю, что x=array1, y=array2, x и y могут быть произвольными arr

[...x,...y].reduce((l,c,i)=>(i<x.length&&l.push(x[i]),i<y.length&&l.push(y[i]),l),[])

рабочий пример (для 3 случаев)

Ответ 6

Вы можете сделать:

const array1 = ["a", "b", "c", "d"];
const array2 = [1, 2];
const mergeArrays = (a, b) => (a.length > b.length ? a : b)
  .reduce((acc, cur, i) => a[i] && b[i] ? [...acc, a[i], b[i]] : [...acc, cur], []);

console.log(mergeArrays(array1, array2)); // ["a",1 ,"b", 2, "c", "d"]

Ответ 7

Это можно сделать довольно просто, используя функцию сплайсинга внутри reduce:

function splicer(array, element, index) {
    array.splice(index * 2, 0, element);
    return array;
}

function weave(array1, array2) {
    return array1.reduce(splicer, array2.slice());
}

let array1 = ["a", "b", "c", "d"];
let array2 = [1, 2];

let outcome = weave(array1, array2);

console.log(outcome);