JavaScript

Как правильно найти наибольший и наименьший значения массива?

Сформировать массив (объект Array), элементами которого
являются значения выражений. Для вычисления выражений использовать
объект Math. Найти максимальный и минимальный элементы массива и их
номера.
В чём ошибка, подскажите?
let max = {};
let min = {};
spec.forEach((el, index) => {
if (index === 0 || el > max.value) {
max.value = el;
max.index = index;
}
if (index === 0 || el < min.value) {
min.value = el;
min.index = index;
}
})

Получатся объекты такого вида:
min {
value: [минимальное число],
index: [индекс минимального числа],
}

max {
value: [максимальное число],
index: [индекс максимального числа],
}

P.S.: твой код не работает, т. к. неправильно применен метод apply - как минимум в том, что ты в него вторым параметром передаешь new Array() - пустой массив, а нужно передавать числа (которые ты записал в массив spec). Если уж на то пошло попробуй Math.max.apply(Math, spec) или Math.max.call(Math, ..spec). Хотя в данном случае контекст нигде теряться не будет, данная запись избыточна, достаточно Math.max(...spec) - это будет работать.
Многоточие перед spec нужно для преобразования данных из массива в последовательность чисел (Math.max принимает не строку и не массив, а числа через запятую).

P.P.S.: Погугли/почитай call, apply, bind - для чего они нужны и когда используются, плюс про операторы spread и rest(это как раз таки многоточия).
Вадим Joker
Вадим Joker
3 807
Лучший ответ
let largest = Math.max(...spec);

Но тебе ведь не только значение, но и индекс максимального элемента найти надо.
Ibragim Ochilov
Ibragim Ochilov
89 554
Полагаю, как-то так:

var p = 3.14,
arr = [
(6 * p * p + 3 * Math.exp(8)),
(2 * Math.cos(4) + Math.cos(12) + 8 * Math.exp(3)),
(3 * Math.sin(9) + Math.log10(5) + Math.sqrt(3)),
(2 * Math.tan(5) + 6 * p + Math.sqrt(12))
],
max = Math.max(...arr),
min = Math.min(...arr),
idxMax = arr.indexOf(max),
idxMin = arr.indexOf(min);
console.log(max);
console.log(idxMax);
console.log(min);
console.log(idxMin);
Алмаз Маченте
Алмаз Маченте
3 695