Страницы

Поиск по вопросам

понедельник, 29 октября 2018 г.

Напишите самое простое решение задачи 'Объединить два массива чередуя их элементы'

Как-то давно наткнулся в нете, на одну из задач которую возможно задать при собеседовании на место «Front-End Web Developer». Так вот ее условие:

Как я понимаю объединяющиеся массивы могут быть разной длины, поэтому нужно написать универсальную функцию, которая сможет вернуть результат двух массивов разной длинны.
let num = [1,2,3,4]; let str = ['a','b','c']; function sum(a,b) { let result = []; for (let i = 0; i < Math.max(b.length, a.length); i++){ result = result.concat(a[i]).concat(b[i]) } console.log(result) return result; } sum(num, str);
У меня получилось что у второго объединяющегося массива последний элемент может быть 'undefined'.
Как можно было бы решить по другому и интересней?
Правильный ответ получит тот у кого решение будет самым коротким и без 'undefined' как у меня. Чтобы увидеть самый 'простой' ответ, вопрос будет закрыт в 15:00 пятница, 6 апреля 2018 г. (GMT+1).Так как ответы увеличиваются с каждым днем, вопрос закроется в 15:00 понедельник, 9 апреля 2018 г. (GMT+1).


Ответ

вариант решения
let a = [1,2,3,4]; let b = ['a','b','c','d','e','f']; let s = Math.max(a.length, b.length)*2; let d = [a,b]; let r = []; for(i=0;i вторая ревизия, укоротил код заменой for на while, и math.floor на формулу
let a = [1,2,3,4]; let b = ['a','b','c','d','e','f']; let s = Math.max(a.length, b.length)*2, d = [a,b], r = [], v, i=-1; while(s-i++){ v = d[i%2][(i-i%2)/2]; // или d[i%2][~~(i/2)] if(v != undefined) r.push(v); } console.log(r)
по заявкам, для произвольного числа массивов.
const merge = (...d) => { let c = d.length, i = -1, v, r = [], s = Math.max(...d.map(x => x.length))*c; while(s-i++){ (v = d[i%c][~~(i/c)]) != undefined ? r.push(v):0; } return r; }; console.log( merge(['a','b'], [1,2,3], ['а','б','в','г']) )

Комментариев нет:

Отправить комментарий