我想使用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)
答案 0 :(得分:4)
在此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)
答案 1 :(得分:2)
要获得预期的结果,请使用以下带有每个单词长度的排序选项
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)
答案 2 :(得分:0)
您正在将单词与数字进行比较:
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> hello”之类的比较。
答案 3 :(得分:0)
因为第一次迭代if(s [i] .length> m)具有m = -infinity。然后在if块内重新分配m的值,因此在下一次迭代中,您要检查s [i] .length是否大于“ hello”
答案 4 :(得分:0)
在迭代中,测试成功,因此您可以这样做:
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)
答案 5 :(得分:0)
您需要单独的变量来保存最长字符串和当前字符串的长度。
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)