Помогите увидеть ошибку пожалуйста
Задача: Создайте функцию sumOfLeasts, которая возвращает сумму двух положительных самых маленьких чисел массива, в котором минимум 4 положительных целых числа. Дробных чисел не предусмотрено. Мой код:
const sumOfLeasts = (arr) => {
return arr.filter(i => i > 0).arr.sort((a,b) => {
`${(a> b ? 1 : -1)}`;
return newSortArr.reduce((a,b) => arr[0] + arr[1],0);
};
};
console.log(sumOfLeasts([19, 5, 42, 2, 77]))
логика:
- фильтрую массив, оставляю все положительные элементы
- сортирую от меньшего к большему
- вывожу сумму первых двух элементов
Не пойму, где ошибка в синтаксисе. Наверное можно упростить до одной строки, но я пока в двух разобраться не могу.
Ответы (3 шт):
Каждый из представленых методов массивов(кроме reduce) возвращает массив, поэтому можно организовать цепочку вызовов.
const sumOfLeasts = (arr) => {
return arr
.filter(i => i > 0) // Фильтруем массив
.sort((a, b) => a - b) // Сортируем
.slice(0, 2) // Оставляем 2 первых элемента
.reduce((acc, it) => acc += it, 0); // считаем сумму
};
console.log(sumOfLeasts([19, 5, 42, 2, 77, -2]));
Подробнее про методы массивов
const sumOfLeasts = (arr) => {
let positiveArr = arr.filter(i => i > 0);
positiveArr.sort((a,b) => a - b);
return positiveArr[0] + positiveArr[1];
};
console.log(sumOfLeasts([19, 5, 42, 2, 77]));
В строке с фильтром, вам нужно присвоить результат фильтрации переменной, и еще нужно использовать метод sort на массиве, а не на результате фильтрации.
Другой способ:
function sumOfLeasts(arr) {
arr.sort((a, b) => a - b); // сортируем массив по возрастанию
let sum = 0;
for (let i = 0; i < 2; i++) { // проходим по массиву два раза
if (arr[i] > 0) { // если элемент положительный
sum += arr[i]; // добавляем его к сумме
}
}
return sum;
}
console.log(sumOfLeasts([19, 5, 42, 2, 77]));
Можно еще так:
function sumOfLeasts(arr) {
let minArr = arr.filter(i => i > 0).sort((a, b) => a - b).slice(0,2) // сортируем и фильтруем массив и выбираем 2 минимальных значения
return minArr.reduce((a,b) => a+b) // суммируем минимальные значения и возвращаем
}
console.log(sumOfLeasts([19, 5, 42, 2, 77]));
или даже вот так:
function sumOfLeasts(arr) {
let positiveArr = arr.filter(i => i > 0);
return Math.min(...positiveArr) + Math.min(...positiveArr.filter(i => i > Math.min(...positiveArr)));
}
console.log(sumOfLeasts([19, 5, 42, 2, 77]));
Ваш код имеет несколько синтаксических ошибок и недостатков в логике: В строке return arr.filter(i => i > 0).arr.sort((a,b) => { вы используете .arr после функции filter, но не должны. Это должно быть только return arr.filter(i => i > 0).sort((a,b) => {
В строке ${(a> b ? 1 : -1)} вы используете шаблонную строку, но не нужно, это должно быть только (a> b ? 1 : -1)
В строке return newSortArr.reduce((a,b) => arr[0] + arr[1],0); вы используете переменную newSortArr, которая не объявлена в коде. Это должно быть return arr.reduce((a,b) => arr[0] + arr[1],0);
В строке return arr.reduce((a,b) => arr[0] + arr[1],0); вы используете arr[0] + arr[1] в качестве аргумента функции reduce, но это не должно быть так, должно быть a + b
В целом, ваша функция не возвращает сумму двух положительных самых маленьких чисел массива, как указано в задаче, потому что вы используете функцию reduce для вычисления суммы первых двух элементов массива, вместо того чтобы использовать индексы 0 и 1 для получения значений и сложения их.
Я предлагаю следующий код для решения задачи:
const sumOfLeasts = (arr) => {
const sortedArr = arr.filter(i => i > 0).sort((a,b) => a - b);
return sortedArr[0] + sortedArr[1];
};
console.log(sumOfLeasts([19, 5, 42, 2, 77]))
Этот код фильтрует массив, оставляя только положительные числа, сортирует их от меньшего к большему, и возвращает сумму первых двух элементов отсортированного массива.