посидел на кодеварс - полюбил "сразу-возврат".
и кстати задачка кажется с какого то подобного ресурса.
ну вобщем, аккумулятором может быть необязательно массив, это может быть и объект, в котором хранятся флаги, вместо заведения переменных через var или запиливания еще одних функций.
алсо - зачем запускать "тяжелый" алгоритм если у нас на входе пусто/одно-элементный массив? сразу возвращаем [array].
единственный минус решения - два раза вызывается typeof в случаях когда он не совпадает.
ещё один чит-код - reduce вернет аккумулятор. а аккумулятор это объект. а к свойству объекта (result) можно обратиться через точку.
не будем слепо добавлять в массивы, для этого есть текущий ключ итератора acc.i (который увеличивается когда появился другой тип элемента).
ну и изначально он = -1, потому что первое же несоответствие last:false !== "какой-то-там-тип-значения" его плюсанет и он станет ноликом.
и еще - мне это нравится потому что тут всего одна проверка, всё остальное достаточно прямолинейно.
нет необходимости делать проверки существования начальных значений "флагов" - главное правильно их задать сразу
function groupByType(array) {
return (array.length < 2) ? [array] : array.reduce(function(acc, current) {
if(typeof current != acc.last){
acc.last=typeof current;
acc.result.push([]);
acc.i++;
}
acc.result[acc.i].push(current);
return acc;
}, { result: [], i: -1,last:false }).result;
};
опдейт.:
подумав и окинув взглядом - можно избавиться и от итератора, он не нужен.
function groupByType(array) {
return (array.length < 2) ? [array] : array.reduce(function(acc, current) {
if(typeof current != acc.last){
acc.last=typeof current;
acc.result.push([]);
}
acc.result[acc.result.length-1].push(current);
return acc;
}, { result: [] ,last:false }).result;
};
groupByType([1, 2, 3, 'a', 4, 5, 'b', 9, 'n', 'm']);