Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Задача по созданию функций в JavaScript

Изучаю JS по учебнику - https://code.mu/ru/javascript/book/prime/functions/basis/advices/
Задача:
Напишите, какие недостатки у следующего кода, и исправьте их:

123456789101112131415
 function func(arr1, arr2) { 
	let res1 = 0; 
	 
	for (let elem of arr) { 
		res1 += elem; 
	} 
	 
	let res2 = 0; 
	 
	for (let elem of arr) { 
		res2 += elem; 
	} 
	 
	return res1 / res2; 
} 

Если следовать по учебнику, то понятно, что нужно изменить имя функции (п.1,п.2,п.8). Не понимаю, как сделать так, чтобы функция выполняла одно действие(п.4) и непонятно чего ещё не хватает

По дате
По рейтингу
Аватар пользователя
Мудрец

В приведенном вами коде есть несколько проблем, которые следует устранить:

1. Названия переменных и функций. Названия переменных `res1`, `res2` и функции `func` не дают понимания о том, что они делают. Лучше выбирать более описательные имена.
2. Использование неправильных переменных в циклах. Вместо `arr` должны быть использованы переменные `arr1` и `arr2`.
3. Двойной обход массивов. Ваш код дважды проходит через каждый массив, что неэффективно.
4. Разделение ответственности. Ваша функция выполняет две задачи: суммирует элементы двух массивов и затем делит результаты. Лучше разделить эти операции на отдельные функции.
5. Деление на ноль. В вашем коде возможно деление на ноль, если все элементы `arr2` равны нулю. Это ситуация должна быть обработана.

Вот исправленный код с учетом этих замечаний:

```js
function sumArrayElements(array) {
let sum = 0;
for (let elem of array) {
sum += elem;
}
return sum;
}

function divideSums(array1, array2) {
let sum1 = sumArrayElements(array1);
let sum2 = sumArrayElements(array2);

if (sum2 === 0) {
throw new Error("Division by zero");
}

return sum1 / sum2;
}
```

В этом исправленном коде:

- Функция `sumArrayElements` выполняет одно действие: суммирует элементы массива.
- Функция `divideSums` также выполняет одно действие: делит сумму элементов одного массива на сумму элементов другого массива.
- Оба цикла выполняются только один раз.
- Деление на ноль обрабатывается с помощью выбрасывания исключения.

Аватар пользователя
Искусственный Интеллект

Весь этот код можно заменить встроенной функцией reduce:

12345
 function func(arr1, arr2) {  
  const sum1 = arr1.reduce((a, x) => a + x, 0);
  const sum2 = arr2.reduce((a, x) => a + x, 0);
  return sum1 / sum2;
} 

Если не нравится, что стрелочная функция дважды одна и та же передаётся, можно её отдельно объявить:

123456
 function func(arr1, arr2) {
  const arraySum = (arr => arr.reduce((a, x) => a + x, 0));
  const sum1 = arraySum(arr1);
  const sum2 = arraySum(arr2); 
  return sum1 / sum2; 
}  

(забавно, что Ответы по-разному подсветили синтаксис в обоих фрагментах кода)