Нахождение наибольшего числа возвращает неправильное значение, когда у меня есть несколько двузначных чисел в массиве - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь найти наибольшее число в массиве.Но мой код дает правильное значение, только если все числа однозначные.Если я включу двузначное число, оно не будет учитываться.

const numb = ['7', '10', '8', '6', '7'];
let arr1 = numb[0];
for (let i = 1; i < numb.length; i++) {
  if (numb[i] >= arr1) {
    arr1 = numb[i];
  }
}

console.log(arr1);

const numb = ['7', '9', '8', '6', '7'];
let arr1 = numb[0];
for (let i = 1; i < numb.length; i++) {
  if (numb[i] >= arr1) {
    arr1 = numb[i];
  }
}

console.log(arr1);

Первый код дает мне вывод 8, когда он должен быть 10. В то время как второй дает мне 9. Что я здесь упускаю?

Ответы [ 5 ]

1 голос
/ 19 июня 2019

Вы сравниваете строки - и они сравниваются лексикографически.

const numb = [7, 10, 8, 6, 7];
let arr1 = numb[0];
for (let i = 1; i < numb.length; i++) {
  if (numb[i] >= arr1) {
    arr1 = numb[i];
  }
}
console.log(arr1);

Также обратите внимание, что самый простой способ найти наибольшее число в массиве - использовать Math.max с расширением.

const numb = [7, 10, 8, 6, 7];
let arr1 = Math.max(...numb);
console.log(arr1);
0 голосов
/ 19 июня 2019

Ваш код работает, если массив является массивом чисел, но так как это не так, вы должны привести к числу:

const numb = ['7','10','8','6','7'];
let arr1 = +numb[0];
for (let i=1 ; i < numb.length ; i++) {
   if(+numb[i] >= +arr1){
     arr1 = +numb[i];
   }
} console.log(arr1); // 10

Как вы можете видеть, теперь это работает, так как мы преобразовали через + все строки в числа. Вы можете сделать это таким образом или просто преобразовать весь массив в числа до , вы начнете перебирать его и оставите другой код как есть.

Точно так же, как к вашему сведению, существуют более краткие способы достижения этого результата:

Поскольку у вас есть массив строк и вы пытаетесь найти число, предпочтительным способом является преобразование этого массива строк в числа, а затем просто использовать Math.max следующим образом:

const arr = ['7','10','8','6','9'];  // <-- array of strings
 
let r = Math.max(...arr.map(x => +x))  // <-- cast to number and find max

console.log(r) // 10

Другой вариант, если вам действительно нужно работать со строками, это отсортировать массив в порядке убывания и взять первый элемент следующим образом:

const arr = ['7','10','8','6','9'];

let r = arr.sort((a,b) => b.localeCompare(a, undefined, { numeric: true }))[0]

console.log(r) // 10

При этом используется метод String.localeCompare с опцией numeric: true, которая учитывает числа в строках при сортировке.

0 голосов
/ 19 июня 2019

Массивы numb заполнены строками, а не числами. Вы можете изменить массивы на числа или использовать parseInt(), если не хотите редактировать исходные массивы.

const numb = ['7','10','8','6','7'];
let arr1 = numb[0];
for (let i=1 ; i < numb.length ; i++)
{
 if(parseInt(numb[i]) >= parseInt(arr1)){
 arr1 = numb[i];
}
} console.log(arr1);


const numb = ['7','9','8','6','7'];
let arr1 = numb[0];
for (let i=1 ; i < numb.length ; i++)
{
if(parseInt(numb[i]) >= parseInt(arr1)){
 arr1 = numb[i];
}
} console.log(arr1);
0 голосов
/ 19 июня 2019

ваш массив numb имеет тип string.на самом деле, ваш цикл не проверяет, например, что 1 > 2, но что лексикографически (в алфавитном порядке) «1» следует после «2». строка"10" не обязательно больше, чем "8", отличается от того, как число 10 явно больше.Измените ваш массив на массив чисел вместо строк.const numb = [1, 5, 6, 2, 33].

0 голосов
/ 19 июня 2019

Вы сравниваете строки, это должны быть цифры.

const numb = [7,10,8,6,7];

'7' > '10' верно, сравнивает 7 с 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...