Почему цикл останавливается на первой итерации? - PullRequest
0 голосов
/ 15 апреля 2019

Я хочу найти самое длинное слово в массиве с помощью цикла for.Но итерация останавливается на первом проходе.Чего мне не хватает?

var a = "hello asdf asdf sdfgfghkkjb";
var s = a.split(" ");
var m = -Infinity;
for (var i = 0; i < s.length; i++) {
  if (s[i].length > m) {
    m = s[i];
  }
}
console.log(m)

Ответы [ 6 ]

4 голосов
/ 15 апреля 2019

В этом операторе if вы сравниваете длину слова с самим словом: if (s[i].length > m).Измените его, чтобы сравнить длины обоих слов: if (s[i].length > m.length) и установить начальное значение m на самое короткое из возможных слов, например, var m = "".

var a = "hello asdf asdf sdfgfghkkjb";
var s = a.split(" ");
var m = "";
for (var i = 0; i < s.length; i++) {
  if (s[i].length > m.length) {
    m = s[i];
  }
}
console.log(m)
2 голосов
/ 15 апреля 2019

Чтобы получить ожидаемый результат, используйте опцию сортировки ниже с длиной каждого слова

  1. Разделить строку на пробел
  2. Сортировать массивы слов по длине по убыванию
  3. Выберите первый элемент для самого длинного слова

var a = "hello asdf asdf sdfgfghkkjb";
var s = a.split(" ").sort((a,b) => b.length - a.length)[0]

console.log (s)

codepen - https://codepen.io/nagasai/pen/KYymjd?editors=1010

Вариант 2: Используя метод Reduce, перебрать массив один раз и вернуть самое длинное слово

var a = "hello asdf asdf sdfgfghkkjb";
var s = a.split(" ").reduce((acc, v) => {
  acc = v.length > acc.length ? v : acc;
  return acc
}, '')

console.log (s)

codepen - https://codepen.io/nagasai/pen/xePrgj?editors=1010

0 голосов
/ 15 апреля 2019

Вам нужны отдельные переменные для хранения длины самой длинной строки и текущей строки.

var a = "hello asdf asdf sdfgfghkkjb";
var s = a.split(" ");
var m = -Infinity;
var longest = '';

for (var i = 0; i < s.length; i++) {
  if (s[i].length > m) {
    longest = s[i];
    m = s[i].length;
  }
}
console.log(longest)
0 голосов
/ 15 апреля 2019

На итерации тест пройден успешно, поэтому вы делаете:

m = s[i];

, что эквивалентно:

m = "hello";

На второй итерации вы тестируете:

if (s[i].length > m)

, что эквивалентно:

if (4 > "hello")

Поскольку вы сравниваете объекты разных типов, он преобразует их в общий тип; в этом случае он пытается преобразовать строку в число. Поскольку строка не является числовой, она преобразуется в NaN, и любое сравнение с NaN всегда возвращает false.

Вам нужны две переменные, одна для текущей максимальной длины, а другая для самой длинной строки.

var a = "hello asdf asdf sdfgfghkkjb";
var s = a.split(" ");
var m = -Infinity; // maximum length
var ms; // longest string
for (var i = 0; i < s.length; i++) {
  if (s[i].length > m) {
    ms = s[i];
    m = ms.length;
  }
}
console.log(ms)
0 голосов
/ 15 апреля 2019

потому что первая итерация if (s [i] .length> m) имеет m = -infinity.затем вы переназначаете значение m внутри блока if, поэтому на следующей итерации вы проверяете, больше ли s [i] .length, чем "hello"

0 голосов
/ 15 апреля 2019

Вы сравниваете слова с числами:

var s = a.split(" ");
var m = -Infinity; // m is a number
for (var i = 0; i < s.length; i++) {
   if (s[i].length > m) { // in first iteration, true, 5 > -Infinity
      m = s[i]; // in first iteration, m becomes a word
   }
}

... в последующих итерациях вы будете сравнивать, например, "4> привет".

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