Мне было интересно, есть ли способ объединить массивы таким образом в javascript
Array1 = ['1', '234', '56']
Array2 = ['1', '2', '45', '56']
Желаемый результат = ['11', '2342', '5645', '56']
Есть ли способ сделать это в языке?
@ MladenIlić, OP запрашивает способ объединения элементов, а не способ объединения.
Да, да, у меня плохо.
Вы можете складывать строки вместе и перебирать массив с помощью forEach или цикла for. Какие исследования вы провели? Где твоя попытка?
Хорошие вопросы показывают, что вы провели собственное исследование, покажите, что вы пробовали, и объясните, в чем именно вы застряли. Вы не должны использовать stackoverflow как службу «напишите этот код для меня». stackoverflow следует использовать как службу решения проблем, когда вы пытались решить проблему самостоятельно и показываете, что вы пытались сделать.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте .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 больше?
Тогда просто поменяйте местами или сделайте тест заранее.
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;
}
Примечание: не используйте имена в верхнем регистре для своих идентификаторов, если они не являются классами.
Возможно, вы захотите снова проверить результат в вопросе.
Слишком быстро прочитал вопрос. Обновленный ответ. Этот ответ рассчитан на производительность (таким образом, цикл for)
Зачем использовать строку шаблона вместо +?
@ jfriend00 причина в том, что элемент является числом, поэтому мы случайно не добавляем значения, а не объединяем их.
Для этого нет встроенной функции, но вот способ добиться этого;
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 посмотрите здесь stackoverflow.com/questions/5501581/…
Кроме того, я предлагаю вам удалить вызов .fill() и испытать его на себе. Второй вариант (вместо этого использовать цикл for) на самом деле намного лучше (с учетом потребления памяти).
Дело в том, что вы просто тратите ресурсы, создавая новый массив, а затем вызывая для него .fill(), и никогда не используете его ни для чего, кроме итератора для .map(). Я бы подумал, что более эффективно просто использовать цикл for с length, вам уже нужно выполнить итерацию, вообще не создавая этот временный массив. С точки зрения эффективности вы создаете массив, содержимое которого никогда не будете использовать, а затем повторяете его дважды.
Ссылка, на которую вы ссылаетесь, не имеет ничего общего с смыслом моих комментариев. Я говорю об использовании for (let i = 0; i < length; i++) вместо new Array(length).fill().map(). Похоже, вы еще не поняли мой комментарий.
Сначала я подумал, что вы спрашиваете, зачем использовать fill(), ссылка, которой я поделился, уточняет это. Использование цикла for действительно лучше с точки зрения потребления памяти. Я согласен с вами уже второй раз.
Хорошо, я проголосовал за то, что вы добавили второй вариант. В jsperf второй вариант примерно на 30% быстрее, и если вы предварительно выделите массив слияния и просто назначите merge[i] = (a1[i] || '') + (a2[i] || '') вместо использования .push(), то это будет примерно на 50% быстрее.
Спасибо за ваш вклад @ jfriend00
Альтернатива с использованием функции 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 мой плохой!
Интересное использование Array.from(). Никогда раньше такого не видел. К вашему сведению, по сравнению со сценариями в ответе Ренато и моими комментариями ниже, это решение оказывается довольно медленно (на 80% медленнее, чем лучший из них). Хотя это творчески.
@ jfriend00 :( О производительности хорошо знать. for-loops очень быстрые!
Вы можете сделать как показано ниже
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, используя строковые функции
Спасибо, что указали на это, я исправил, но похоже на беспорядок. пожалуйста, поправьте меня, если я ошибаюсь
да .. есть способ