@zavod22

Как выполнять различные действия в зависимости от содержимого массива?

Есть следующая задача: написать функцию, которая будет принимать в качестве аргумента массив данных, и если в этом массиве содержатся только числа, то возвращать их произведение, а если в этом массиве только строки, то возвращать строку, собранную из строк-элементов массива (конкатенация строк). В любых других случаях функция должна возвращать null.

Дошел до этого момента, а дальше не получается:

function myFunction (arr){
var x = 1;
var y = "";
for(var i = 0; i <= length -1; i++){
	if ( typeof arr[i] === 'number' ) {
 		x*= arr[i];
	}
    else if (typeof arr[i] === 'string'){
    	y+=arr[i];
    	}
    } 
}
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
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;
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы