Слияние массивов в Javascript / Node.js

Мне было интересно, есть ли способ объединить массивы таким образом в javascript

Array1 = ['1', '234', '56']

Array2 = ['1', '2', '45', '56']

Желаемый результат = ['11', '2342', '5645', '56']

Есть ли способ сделать это в языке?

да .. есть способ

vinayakj 29.03.2018 00:32

@ MladenIlić, OP запрашивает способ объединения элементов, а не способ объединения.

CertainPerformance 29.03.2018 00:33

Да, да, у меня плохо.

Mladen Ilić 29.03.2018 00:33

Вы можете складывать строки вместе и перебирать массив с помощью forEach или цикла for. Какие исследования вы провели? Где твоя попытка?

Chris G 29.03.2018 00:34

Хорошие вопросы показывают, что вы провели собственное исследование, покажите, что вы пробовали, и объясните, в чем именно вы застряли. Вы не должны использовать stackoverflow как службу «напишите этот код для меня». stackoverflow следует использовать как службу решения проблем, когда вы пытались решить проблему самостоятельно и показываете, что вы пытались сделать.

jfriend00 29.03.2018 01:03
Поведение ключевого слова "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) для оценки ваших знаний,...
1
5
796
5

Ответы 5

Используйте .map для преобразования одного массива в другой:

const Array1 = ['1', '234', '56']
const Array2 = ['1', '2', '45', '56'];
const merged = Array2.map((arr2elm, i) => (Array1[i] ? Array1[i] : '') + arr2elm);
console.info(merged);

Что, если array1 больше?

Renato Gama 29.03.2018 00:36

Тогда просто поменяйте местами или сделайте тест заранее.

CertainPerformance 29.03.2018 00:42
function mergeArrays(array1, array2) {
   const count = array1.length > array2.length 
      ? array1.length
      : array2.length;

   const result = [];

   for (let i = 0; i < count; i++) {
      result.push(`${ array1[i] || '' }${ array2[i] || '' }`);
   }

   return result;
}

Примечание: не используйте имена в верхнем регистре для своих идентификаторов, если они не являются классами.

Возможно, вы захотите снова проверить результат в вопросе.

Chris G 29.03.2018 00:35

Слишком быстро прочитал вопрос. Обновленный ответ. Этот ответ рассчитан на производительность (таким образом, цикл for)

Milan Adamovsky 29.03.2018 00:51

Зачем использовать строку шаблона вместо +?

jfriend00 29.03.2018 02:19

@ jfriend00 причина в том, что элемент является числом, поэтому мы случайно не добавляем значения, а не объединяем их.

Milan Adamovsky 29.03.2018 16:47

Для этого нет встроенной функции, но вот способ добиться этого;

var a1 = ['1', '234', '56'];
var a2 = ['1', '2', '45', '56'];

var length = Math.max(a1.length, a2.length)
var merge = new Array(length).fill().map((el, index) => {
    return (a1[index] || '') + (a2[index] || '')
})

console.info(merge)

Этот код даст вам правильный ответ независимо от того, какой массив больше.

Обновлено:

Согласно предложению комментатора, используя цикл for, вы не будете тратить ресурсы памяти, создавая массив только для целей итерации.

    var a1 = ['1', '234', '56'];
    var a2 = ['1', '2', '45', '56'];

    var length = Math.max(a1.length, a2.length)
    var merge = []
    for (var i = 0; i < length; i++) {
      merge.push((a1[i] || '') + (a2[i] || ''))
    }

    console.info(merge)

И даже быстрее, если вы замените .push() назначением:

    var a1 = ['1', '234', '56'];
    var a2 = ['1', '2', '45', '56'];

    var length = Math.max(a1.length, a2.length);
    var merge = new Array(length);
    for (var i = 0; i < length; i++) {
      merge[i] = (a1[i] || '') + (a2[i] || '');
    }

    console.info(merge);

Зачем создавать массив, заполненный пустотой, а потом использовать на нем .map()? Можно также просто использовать цикл for для заполнения нового массива.

jfriend00 29.03.2018 01:23

@ jfriend00 посмотрите здесь stackoverflow.com/questions/5501581/…

Renato Gama 29.03.2018 01:25

Кроме того, я предлагаю вам удалить вызов .fill() и испытать его на себе. Второй вариант (вместо этого использовать цикл for) на самом деле намного лучше (с учетом потребления памяти).

Renato Gama 29.03.2018 01:26

Дело в том, что вы просто тратите ресурсы, создавая новый массив, а затем вызывая для него .fill(), и никогда не используете его ни для чего, кроме итератора для .map(). Я бы подумал, что более эффективно просто использовать цикл for с length, вам уже нужно выполнить итерацию, вообще не создавая этот временный массив. С точки зрения эффективности вы создаете массив, содержимое которого никогда не будете использовать, а затем повторяете его дважды.

jfriend00 29.03.2018 01:27

Ссылка, на которую вы ссылаетесь, не имеет ничего общего с смыслом моих комментариев. Я говорю об использовании for (let i = 0; i < length; i++) вместо new Array(length).fill().map(). Похоже, вы еще не поняли мой комментарий.

jfriend00 29.03.2018 01:30

Сначала я подумал, что вы спрашиваете, зачем использовать fill(), ссылка, которой я поделился, уточняет это. Использование цикла for действительно лучше с точки зрения потребления памяти. Я согласен с вами уже второй раз.

Renato Gama 29.03.2018 01:32

Хорошо, я проголосовал за то, что вы добавили второй вариант. В jsperf второй вариант примерно на 30% быстрее, и если вы предварительно выделите массив слияния и просто назначите merge[i] = (a1[i] || '') + (a2[i] || '') вместо использования .push(), то это будет примерно на 50% быстрее.

jfriend00 29.03.2018 01:38

Спасибо за ваш вклад @ jfriend00

Renato Gama 29.03.2018 03:31

Альтернатива с использованием функции Array.from

Функция Array.from принимает три параметра:

  • arrayLike Подобный массиву или повторяемый объект для преобразования в массив.
  • mapFn Функция сопоставления для вызова каждого элемента массива. По желанию.
  • thisArg Значение, которое будет использоваться при выполнении mapFn По желанию.

Этот подход передает объект с обязательным свойством length (подобный массиву или повторяемый объект) с максимальной длиной из обоих массивов, и обратный вызов предоставит два параметра:

  • value (в данном случае undefined) из массива
  • Текущий index.

По сути, обратный вызов объединяет два значения, и оба операнда проверяют текущее значение по определенному индексу, потому что не обязательно массивы имеют одинаковую длину.

var arr1 = ['1', '234', '56'],
    arr2 = ['1', '2', '45', '56'],
    newArray = Array.from({length: Math.max(arr1.length, arr2.length)}, 
                         (_, i) => ((arr1[i] || '') + (arr2[i] || '')));
//                        ^  ^
//                        |  |
//                        |  +---- This is the current index.
//                        |
//                        +---- In this case, the value is undefined
//                              and is unnecessary to accomplish your
//                              scenario.
console.info(newArray);

Некоторое объяснение кода и того, как / почему он работает, может сделать этот ответ более полезным.

jfriend00 29.03.2018 01:20

@ jfriend00 мой плохой!

Ele 29.03.2018 01:35

Интересное использование Array.from(). Никогда раньше такого не видел. К вашему сведению, по сравнению со сценариями в ответе Ренато и моими комментариями ниже, это решение оказывается довольно медленно (на 80% медленнее, чем лучший из них). Хотя это творчески.

jfriend00 29.03.2018 02:17

@ jfriend00 :( О производительности хорошо знать. for-loops очень быстрые!

Ele 29.03.2018 02:19

Вы можете сделать как показано ниже

let Array1 = ['1', '234', '56','11','11','22']; 
let Array2 = ['1', '2', '45', '56'];
let new_arr=[];
new_arr=Array1.map((object,i) => object + Array2[i]).concat(Array2.splice(Array1.length,1));
//remove undefined due to variable size
let new_arr_str=new_arr.join(",").replace(/undefined/g,'');
console.info(new_arr_str.split(","));

Я удалил неопределенную переменную, если array1 больше массива 1, используя строковые функции

Спасибо, что указали на это, я исправил, но похоже на беспорядок. пожалуйста, поправьте меня, если я ошибаюсь

sumit 29.03.2018 01:58

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