2016-11-16 2 views
21

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

function findLongestWord(str) { 

    var charArray = str.split(" "); 
    var wordArray = []; 


    for(var i = 0; i < charArray.length; i++) { 
    wordArray.push(charArray[i].length); 
    wordArray.sort(); 
    wordArray.reverse(); 

    } 

    return wordArray[0]; 
} 

Моя функция работает с входами, такими как:

findLongestWord("The quick brown fox jumped over the lazy dog"); 

Но когда я передать его:

findLongestWord("What if we try a super-long word such as otorhinolaryngology") 

Функция возвращает:

4 

Вместо

19 
+9

'.sort()' не работает, как и следовало ожидать. Попробуйте предоставить ему обратный вызов, который правильно сортирует ваши номера. – Gavin

+1

Каков результат, если вы удалите wordArray, reverse(); –

+1

@AnnaJeanine Without '.reverse()' i get '1' –

ответ

24

В соответствии с the docs:

Способ сортировки() сортирует элементы массива на месте и возвращает массив . Сортировка не обязательно stable. Сортировка по умолчанию заказывается в соответствии с строковыми кодами Unicode.

[...]

Синтаксис

arr.sort()

arr.sort(compareFunction)

Параметры

compareFunction Дополнительный

Speci fies функция, которая определяет порядок сортировки. Если этот параметр опущен, массив сортируется в соответствии со значением кода юникода каждого символа в соответствии с преобразованием строки каждого элемента.

Упор мой, так что вы в конечном итоге с чем-то вроде этого:

var str = "What if we try a super-long word such as otorhinolaryngology"; 
var charArray = str.split(" "); 
// now charArray == ["What", "if", "we", "try", "a", "super-long", "word", "such", "as", "otorhinolaryngology"] 
// when you take the length of each word and end up with 
var wordArray = [4, 2, 2, 3, 1, 10, 4, 4, 2, 19]; 
// and if you use plain wordArray.sort() without specific sort function you get 
wordArray = [1, 10, 19, 2, 2, 2, 3, 4, 4, 4]; 
// and once reversed it is 
wordArray = [4, 4, 4, 3, 2, 2, 2, 19, 10, 1]; 
// this is why you end up with wordArray[0] == 4 

В заключение, ваши номера становятся отсортированы как строки.

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

wordArray.sort(function(a, b) { return b - a; }); 

Вы также могли бы реализовать все функции в качестве однострочника:

function findLongestWord(str) { 
 
    return str.split(/\s+/).sort(function(a, b) { return b.length - a.length; })[0].length; 
 
} 
 

 
console.log("Longest word length = ", findLongestWord("The default sort order is according to string Unicode code points")); 
 

 
console.log("Longest word length = ", findLongestWord("What if we try a super-long word such as otorhinolaryngology"));

1

вам нужно передать функцию сортировки:

function findLongestWord(str) { 

    var charArray = str.split(" "); 
    var wordArray = []; 


    for(var i = 0; i < charArray.length; i++) { 
    wordArray.push(charArray[i].length); 
    wordArray.sort(function(a,b){ 
     return a > b; 
    }); 
    wordArray.reverse(); 

    } 

    return wordArray[0]; 
} 

var longest = findLongestWord("What if we try a super-long word such as otorhinolaryngology"); 
15

Немного отличается от вашего кода, но это должно иметь тот же результат!

function longestWord(string) { 
 
    var str = string.split(" "); 
 
    var longest = 0; 
 
    for (var i = 0; i < str.length; i++) { 
 
     if (longest < str[i].length) { 
 
      longest = str[i].length; 
 
     } 
 
    } 
 
    return longest; 
 
} 
 

 
console.log(longestWord("The quick brown fox jumped over the lazy dog")); 
 
console.log(longestWord("What if we try a super-long word such as otorhinolaryngology"));

+4

Спасибо за исправление! Это правильный способ сделать это - без создания глупых массивов длин. – georg

2

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

function findLongestWord(str) { 
 
    var charArray = str.split(" "); 
 
    var longestWord = 0; 
 

 
    for (var i = 0; i < charArray.length; i++) { 
 
    let l = charArray[i].length; 
 
    if (l > longestWord) 
 
     longestWord = l; 
 
    } 
 
    return longestWord; 
 
} 
 

 
console.log(findLongestWord("The quick brown fox jumped over the lazy dog")); 
 
console.log(findLongestWord("What if we try a super-long word such as otorhinolaryngology"));

26

Ваша функция сортировки сортирует массив лексически, так что вы в конечном итоге с

[1,10,19,2,2,2,3,4,4,4] 

реверсом, который вы получите

[4,4,4,3,2,2,2,19,10,1] 

где 4 является первым номер

Вам не нужна сортировка вообще, просто использовать Math.max вместо

function findLongestWord(str) { 
    return Math.max.apply(null, str.split(" ").map((x) => x.length)); 
} 
1

sort функции сортировки массива в лексикографическом способе, который не то, что вы хотите Вот. Вам также нужно передать метод сортировки, если вы хотите совершенную сортировку по возрастанию для чисел. Кроме того, вы сортируете и реверсируете массив в цикле for, поэтому вы делаете это каждый раз, когда элемент добавляется.

Что вы должны сделать вместо этого:

for(var i = 0; i < charArray.length; i++) { 
    wordArray.push(charArray[i].length); 
    } 

wordArray.sort(ascendingSort); 
wordArray.reverse(); 

function ascendingSort(a, b) { 
    return a - b; 
} 

return wordArray[0]; 
+0

Казалось бы, так. Я ошибочно считал, что лексикографической сортировки будет достаточно, поскольку это цифры, а не только строки. Я отредактирую свой ответ, чтобы избежать путаницы. –

6

Вы можете получить массив длин слов, а затем использовать Math.max.apply

function findLongestWord(str){ 
 
    return Math.max.apply(null, str.split(" ").map(x=>x.length)); 
 
} 
 

 
var l = findLongestWord("What if we try a super-long word such as otorhinolaryngology") 
 

 
console.log(l)

4

function findLongestWord(str) { 
 
    return str.split(' ').reduce((m, w) => Math.max(m, w.length), 0); 
 
} 
 

 
var result = findLongestWord('The quick brown fox jumped over the lazy dog'); 
 
console.log(result);

+2

«уменьшить» является более естественным здесь 'arr.reduce ((m, w) => Math.max (m, w.length), 0)' – georg

4

лучший подход к проблеме (на мой взгляд) с помощью map и max:

function findLongestWord(str) { 
    return Math.max.apply(null, str.split(" ").map(function(word){ 
     return word.length; 
    })); 
} 
2

Кратчайший путь:

console.log(
 
    'What if we try a super-long word such as otorhinolaryngology' 
 
    .split(' ') 
 
    .sort(function(a, b) { 
 
    return b.length - a.length 
 
    })[0].length 
 
);

Или как функцию:

function returnLongest(str) { 
 
    return str 
 
    .split(' ') 
 
    .sort(function(a, b) { 
 
     return b.length - a.length 
 
    })[0].length; 
 
} 
 
console.log(returnLongest('What if we try a super-long word such as otorhinolaryngology'))

+1

OP хочет вернуть длину самого большого слова, а не массив отсортированные слова. – Gavin

+0

@Gavin Ой, ты прав. Я исправлю. –

0

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

function findLongestWord(str) { 

    var charArray = str.split(" "); 
    var longestWordLength = 0; 
    var longestWord = ""; 

    for(var i = 0; i < charArray.length; i++) { 
    if(charArray[i].length > longestWordLength){ 
     longestWordLength = charArray[i].length; 
     longestWord = charArray[i] 
    } 
    } 
    return {longestWord , longestWordLength}; 
} 
Смежные вопросы