if ( typeof arr[i] === 'number' ) {
x*= arr[i];
А что если
arr[i + 1]
окажется строкой? Сначала надо проверить всё, а уже потом вычислять (если потребуется) объединённое значение:
function bullshit(arr) {
if (arr.every(n => typeof n === 'number')) {
return arr.reduce((acc, n) => acc * n, 1);
}
if (arr.every(n => typeof n === 'string')) {
return arr.join('');
}
return null;
}
bullshit([ 1, 2, 3 ]) // 6
bullshit([ 'a', 'b', 'c' ]) // 'abc'
bullshit([ 1, '!' ]) // null
или
function bullshit(arr) {
const count = arr.reduce((acc, n) => {
const type = typeof n;
acc[type] = (acc[type] || 0) + 1;
return acc;
}, {});
switch (arr.length) {
case count.number: return arr.reduce((acc, n) => acc * n, 1);
case count.string: return arr.join('');
default: return null;
}
}