Как объединить два массива, как в этом примере, в Javascript?

Есть два массива, первый состоит из трех элементов, второй - из двенадцати, как показано ниже:

array_foo = ['a','b','c'];
array_bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

Я хочу их объединить и поставить a за 4, поставить b за 8, поставить c за 12, то есть :

array_result=['1','2','3','4','a','5','6','7','8','b','9','10','11','12','c'];

Как это сделать с помощью Javascript?

Обновить:

Я не уверен, что ниже все хорошо, есть лучший ответ?

array_bar.forEach((item, index) => {
    let array_foo_first = array_foo.slice(0, 4 * (index + 1) + index);
    let array_foo_last = array_foo.slice(4 * (index + 1) + index);
    array_foo = [
        ...array_foo_first,
        item,
        ...array_foo_last
    ]
});

так правило каждые 4 array_bar 1 из array_foo?

Gerardo BLANCO 04.06.2018 14:38

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

Ronn Wilder 04.06.2018 14:39

похоже на простой цикл, вы пытались что-нибудь?

epascarello 04.06.2018 14:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
54
3

Ответы 3

Я оказался довольно простым, вам просто нужно немного расширить цикл for:

array_foo=['a','b','c'];
array_bar=['1','2','3','4','5','6','7','8','9','10','11','12'];


for (let i = 4,j=0; i<array_bar.length; i+=4,j++) {
  array_bar.splice(i+j, 0, array_foo[j]);
}

array_bar = array_bar.join();

console.info(array_bar);

Краткое объяснение цикла:

Вместо одного индекса вы отслеживаете два: i для array_bar и j для array_foo. Вы каждый раз увеличиваете i на 4, а i на единицу, так как вы хотите, чтобы они располагались следующим образом (4: 1).

for (let i = 4,j=0; i<array_bar.length; i+=4,j++)

splice позволяет вам вставить элемент в заданную позицию, здесь мы вставляем элемент в i+j, который является 4+0, 8+1 и 12+2, то есть всегда 4 элемента от array_bar.

array_bar.splice(i+j, 0, array_foo[j]);

Если шаблон указан в 4 array_bar 1 из array_foo. Затем я бы сделал небольшой цикл, который выполнит это.

Это петли на основе array_bar

Надеюсь, это поможет:>

var array_foo=['a','b','c'];
var array_bar=['1','2','3','4','5','6','7','8','9','10','11','12'];
var array_new = [];

array_bar.forEach((el,i)=>{
  if ((i)%4==0 && i!=0)
    array_new.push(array_foo[(i/4)-1])
  array_new.push(el);
})
array_new.push(array_foo[array_foo.length-1]);

console.info(array_new)

Использование .forEach()

Вы можете выполнить цикл по массиву foo и для каждого элемента объединить 4-элементный фрагмент bar с текущим элементом foo, а затем объединить результат с res, содержащим все предыдущие фрагменты.

foo = ['a','b','c'];
bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

res = [];
foo.forEach((e,i) => { res = res.concat(bar.slice(4*i,4*i+4)).concat(e) } );

console.info(res)

Использование .map()

Мы можем добиться того же результата, используя вместо этого .map:

[].concat.apply([], foo.map((e,i) => bar.slice(4*i,4*i+4).concat(e)))

Итак, я отображаю foo следующим образом:

foo[i] <- [bar[4*i], bar[4*i+1], bar[4*i+2], bar[4*i+3], foo[i]] (pseudocode!)

Затем я объединяю все массивы в один: с [].concat.apply([], arrayOfArrays)

foo = ['a','b','c'];
bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

res = [].concat.apply([], foo.map((e,i) => bar.slice(4*i,4*i+4).concat(e)));

console.info(res)

Без использования .concat

Метод .concat (использованный в двух предыдущих версиях) создает новый массив. Если вы ищете другое решение, все еще использующее .map, вот оно:

foo.map((e,i) => res.push(...bar.slice(i*4, i*4+4), foo[i]));

Вместо того, чтобы объединять массивы, мы вставляем фрагмент элементов bar с элементом foo для каждого элемента foo. Я также использую синтаксис деструктурирующее задание, чтобы развернуть кусок в аргументы, переданные в .push.

foo = ['a','b','c'];
bar = ['1','2','3','4','5','6','7','8','9','10','11','12'];

res = [];
foo.map((e,i) => res.push(...bar.slice(i*4, i*4+4), foo[i]));

console.info(res)

Другие вопросы по теме