Максимальное и минимальное значение в массиве на JavaScript
Начало стандартное: я новичок в JavaScript. Прежде чем задать вопрос, почитал тут: Максимальное и минимальное значение в массиве
Задача: на вход функции подается строка с числами, разделенными пробелом. Нужно вернуть строку с максимальным и минимальным числом.
Примеры строк: "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6" "10 2 -2 -10" "1 -1" "42"
Пример использования: str = "10 2 -2 -10"; result = function(str); Переменная result содержит 10 -10.
function fifth(str) {
alert('Рассматриваем массив: ' + str);
var arr = []
var max = str[0];
var min = str[0];
arr = str.split(' ');
alert('Количество элементов в массиве: ' + arr.length );
alert('Массив: ' + arr);
for (var i = 0; i < arr.length; i++) { // переберем весь массив
// если элемент больше, чем в переменной, то присваиваем его значение переменной
//alert('Значение arr[i]: '+ arr[i]);
if (parseInt(max,10) < arr[i]) {
max = arr[i];
} else if (parseInt(max,10) == arr[i]) {
alert('Максимальное значение arr[i]: '+ arr[i] + ' равно ' + arr[i]);
max = arr[i];
}
//alert('Проверяем на максимальное значение arr[i]: ' + arr[i]);
}
for (var i = 0; i < arr.length; i++) {
alert('Сравнимаем min ' + min + ' и ' + arr[i]);
if (parseInt(min,10) > arr[i]) {
min = arr[i];
} else if (parseInt(min,10) == arr[i]) {
alert('Минимальное значение arr[i]: '+ arr[i] + ' равно ' + arr[i]);
min = arr[i];
}
}
alert('Минимальное значение в массиве: ' + min + '\nМаксимальное значение в массиве: ' + max);
result = max + ' ' + min;
return result;
}
//str = "3 -6";
//str = '4, 5, 29, 54, 4, 0, -214, 542, -64, 1, -3, 6, -6';
//str = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6";
str = "42";
//var result = fifth("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6");
var result = fifth(str);
alert('Результат: ' + result);
Первая проблема, с которой столкнулся - если число из трёх цифр, то тоно не участвует в сравнении. Решил это используя parseInt(max,10).
Вторая проблема: если в функцию передать одно строку, состоящую из одного числа, например, 42, то результат не тот, который ожидается.
С Math.min экспериментировал:
function fifth(str) {
var min = 0;
var max = 0;
var result = 0;
var arr = []
arr = str.split('');
var re = / /gi;
var newstr = str.replace(re, ', ');
alert('Рассматриваем массив: ' + str);
alert('Рассматриваем массив: ' + newstr);
min = Math.min.apply(Math, [arr]);
max = Math.max.apply(Math, [arr]);
alert('Минимальное значение в массиве: ' + min + '\nМаксимальное значение в массиве: ' + max);
result = min + ' ' + max;
return result;
}
str = "42";
//str = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6";
//var result = fifth("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6");
var result = fifth(str);
alert('Результат: ' + result);
В итоге получаю:
Минимальное значение в массиве: NaN Максимальное значение в массиве: NaN
Научите как правильно решить данную задачу.
Ответы (3 шт):
const arrStr = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"
console.log(getMiAnMax(arrStr))
function getMiAnMax(str) {
const numbers = str.split(' ')
return {
min: Math.min(...numbers),
max: Math.max(...numbers)
}
}
const arrStr = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"
console.log(getMiAnMax(arrStr))
function getMiAnMax(str) {
const numbers = str.split(' ').map(e => +e)
return {
min: numbers.reduce((a, v) => (v < a ? a = v : {}, a)),
max: numbers.reduce((a, v) => (v > a ? a = v : {}, a))
}
}
const arrStr = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"
console.log(getMiAnMax(arrStr))
function getMiAnMax(str) {
const numbers = str.split(' ').map(e => +e)
return {
min: getMin(numbers),
max: getMax(numbers)
}
}
function getMin(arr) {
let min = arr[0]
arr.forEach(e => e < min ? min = e : {})
return min
}
function getMax(arr) {
let max = arr[0]
arr.forEach(e => e > max ? max = e : {})
return max
}
По второй проблеме ишите здесь ответ
var max = str[0];
var min = str[0];
arr = str.split(' ');
Попробуйте вместо этого:
arr = str.split(' ');
var max = arr[0];
var min = arr[0];
• var arr = []; arr = str.split(' ');
Создаете ненужный массив [], а можно на ходу сразу сделать var arr = str.split(" ");
• var max = str[0]; var min = str[0]; — у вас в этом месте строка еще не превращена в массив, поэтому в переменные попадает первый символ строки str, "42"[0] → "4"
• Сравнение у вас работало неправильно, потому что разбивая строки через split, на выходе получаете массив из строк. А строки в JS сравниваются посимвольно:
var a = "1111";
var b = "19";
console.log( a < b ) // true
// Сперва сравниваются `a[0]` и `b[0]` → равны, потом `a[1]` и `b[1]` → второй больше.
Чтобы такого не происходило, надо во время сравнения их привести к числовому типу, что и происходило у вас из-за parseInt. Можно эту же функцию использовать сразу во время создания массива и все строки превратить в числа:
var arr = str.split(' ').map(parseInt);
• Два цикла не обязательно: Можно сразу одним циклом проверить и min, и max:
console.log( fifth("42") );
console.log( fifth("4 5 29 54 4 0 -64 1") );
function fifth(str) {
let arr = str.split(' ').map(Number);
let min = arr[0], max = arr[0];
for (let i = 0; i < arr.length; i++) {
if( arr[i] < min ) min = arr[i];
if( arr[i] > max ) max = arr[i];
}
return min + " " + max;
}