const newArray = numbers.filter(i => i !== firstMin);
Что, если минимальный элемент представлен в нескольких экземплярах? Вы их все выкинете.
Можно найти индекс минимального элемента и фильтровать по индексу:
function sumTwoSmallestNumbers(nums) {
const iMin = nums.indexOf(Math.min(...nums));
return nums[iMin] + Math.min(...nums.filter((_, i) => i !== iMin));
}
Это если идти вашим путём. Но есть и иные способы решить задачу. Например, можно отсортировать массив и взять два крайних элемента:
const sumTwoSmallestNumbers = ([...nums]) => nums
.sort((a, b) => b - a)
.slice(-2)
.reduce((acc, n) => acc + n, 0);
Или, сосчитать, кто сколько раз повторяется и выбирать второе слагаемое в зависимости от количества повторений первого:
function sumTwoSmallestNumbers(nums) {
const count = Object.entries(nums.reduce((acc, n) => (acc[n] = -~acc[n], acc), {}));
return +count[0][0] + +count[+(count[0][1] === 1)][0];
}
Или, пройти по массиву один раз, запоминая встреченные элементы, если они меньше тех, что вам уже попадались (т.е., сделать то, чего от вас тут и ожидается - решить задачу с линейной сложностью по времени и константной по памяти):
function sumTwoSmallestNumbers(nums) {
let min1 = Infinity;
let min2 = Infinity;
for (const n of nums) {
if (n < min1) {
[ min1, min2 ] = [ n, min1 ];
} else if (n < min2) {
min2 = n;
}
}
return min1 + min2;
}
// или
const sumTwoSmallestNumbers = nums =>
eval(nums.reduce(([ min1, min2 ], n) =>
n < min1 ? [ n, min1 ] :
n < min2 ? [ min1, n ] :
[ min1, min2 ]
, [ Infinity, Infinity ]).join('+'));