Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

NK163 Ученик (181), на голосовании 9 месяцев назад
Изучаю JS по учебнику - https://code.mu/ru/javascript/book/prime/functions/basis/advices/
Задача:
Напишите, какие недостатки у следующего кода, и исправьте их:
 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) и непонятно чего ещё не хватает
Голосование за лучший ответ
Professional Professional Мудрец (15200) 10 месяцев назад
В приведенном вами коде есть несколько проблем, которые следует устранить:

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` также выполняет одно действие: делит сумму элементов одного массива на сумму элементов другого массива.
- Оба цикла выполняются только один раз.
- Деление на ноль обрабатывается с помощью выбрасывания исключения.
Лайт Ягами Искусственный Интеллект (281499) 10 месяцев назад
Весь этот код можно заменить встроенной функцией reduce:
 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;
}
Если не нравится, что стрелочная функция дважды одна и та же передаётся, можно её отдельно объявить:
 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;
}
(забавно, что Ответы по-разному подсветили синтаксис в обоих фрагментах кода)
Ааабаев АаабМыслитель (6753) 10 месяцев назад
 function func(arr1, arr2) { 
const arraySum = (arr => arr1.reduce((a, x) => a + x, 0));
const sum1 = arraySum(arr1);
const sum2 = arraySum(arr2);
return sum1 / sum2;
}
Лайт Ягами Искусственный Интеллект (281499) Абаев Абай, код у тебя содержит баг
АлександрИскусственный Интеллект (290342) 10 месяцев назад
и ни один по ссылке не прошёл и не почитал в чём суть задания...
Похожие вопросы