返回数组中最长的字符串(JavaScript)

7

我正在尝试在一个字符串数组中找到最长的字符串。我之前遇到过类似的问题,需要返回最长字符串的长度。我的代码可以正常工作,在以下情况下返回11:

var long1= 0;

var plorp = ["bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"];

function longestString(arr){
  for (i=0; i<arr.length; i++){
      if (arr[i].length > long1){
        long1= arr[i].length;
      }

  }
  return long1;
}

但是,如果我将long1 = arr[i].length;更改为long1 = arr[i];,它只会返回arr[0]。我错过了什么吗?否则循环似乎正在正确迭代。
编辑:也就是说,它返回bbllkw

你正在用字符串覆盖整数值,并尝试将一个变量用于多个事情。你应该保留 long1= arr[i].length 并在最后返回 arr[long1] - Tamás Sengel
1
@the4akman,你是错误的。long1包含的是最长的长度而不是索引。所以arr[long1]很可能未定义。 - Zamrony P. Juhara
7个回答

14

你可以使用reduce代替:

var plorp = ["bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"];
var longest = plorp.reduce(function(a, b) { 
  return a.length > b.length ? a : b
}, '');
console.log(longest);

或者 ES6 版本:

var plorp = ["bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"];
var longest = plorp.reduce((a, b) => a.length > b.length ? a : b, '');
console.log(longest);


1
很棒的ES6一行代码:plorp.reduce((p, c) => p.length > c.length ? p : c) - Andy
@Andy 谢谢回复。我在考虑用ES6写这个,但不确定OP是否可以在他的环境中使用ES6... 我也将这个添加到答案中。谢谢! - Dekel
太棒了!我对ES6有点陌生,但它很有道理。还有,我是女孩 :) - leandraaar

3

您需要将长声明更改为:

var long1= '';

在for循环条件中,应该是

arr[i].length > long1.length

3

在用户需要更基础的解决方案后更新

这里我们使用reduce函数找到数组项中最长的长度,然后使用filter函数筛选具有该长度的元素。如果它们具有相同但最长的长度,则返回多个元素。

var plorp = ['sameLength', 'someoth', 'asfzc', 'sameLLngth'];
    ln = plorp.reduce((r,s) => r > s.length ? r : s.length, 0);


const result = plorp.filter(pl => pl.length == ln);

console.log(result);

旧答案

如果数组中存在多个最长字符串,它将返回一个包含这些字符串的数组。如果只有一个最长字符串,则返回该字符串,而不是数组。

新答案

如果数组中有多个最长的字符串,函数将返回这些字符串组成的数组。如果只有一个最长字符串,则函数将返回该字符串,而不是数组。

var plorp = ["bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"];
var wholeArr = [];

function longestString(arr) {
    var tlength = 0;
    for(var i =0; i < plorp.length; i++){
      if(tlength < plorp[i].length){
        tlength = plorp[i].length;
      }
    }
    for(var j =0; j < plorp.length; j++){
      if(plorp[j].length == tlength){
         wholeArr.push(plorp[j]);
      }
    }
   if(wholeArr.length == 1){
     return wholeArr[0]
   }else{
      return wholeArr
  }
}


console.log(longestString(plorp));

很棒,但有没有一种更加函数化且不那么冗长的写法? - Gismo Ranas
是的,我已经为您更新了,@GismoRanas。 - Ahmed Can Unbay
我最终找到了自己的解决方案,并在下面写出来了。谢谢! - Gismo Ranas

1

var arr = ["第一", "第二", "第三", "第四", "第一千"]

function getLongestString(arr) { let longestStringArr = arr.sort((a, b) => a.length - b.length).reverse(); return longestStringArr[0]; }

console.log(getLongestString(arr))


0

问题出在当你设置

long1=arr[i];

你需要将其与整数值进行比较。

在第一次迭代中,你将0的整数值与第一个字符串的长度进行比较,这显然会使比较表达式的结果为true,并且你设置了

 long1=arr[0];

对于下一次迭代,long1 不再包含整数值,而是包含字符串,因此长度和 long1 之间的比较总是返回 false。

这就是为什么你总是得到第一个字符串作为结果。

你需要将 long1 初始化为空字符串,并像 belhadj 的答案建议的那样使用 long1.length 进行比较。


0

只需比较字符串的长度,然后将字符串本身分配给long1。

var plorp = ["bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"];

function longestString(arr) {
  var long1 = arr[0];
  for (i = 0; i < arr.length; i++) {
    if (arr[i].length > long1.length) {
      long1 = arr[i];
    }
  }
  return long1;
}


console.log(longestString(plorp));


0
另一种解决方案涉及数组的sort方法和比较函数,但这可能是一个“繁重”的解决方案,如MDN所述:

根据compareFunction的性质,这可能会产生很高的开销。compareFunction执行的工作越多,要排序的元素越多,考虑使用映射进行排序可能会更明智。

因此,根据上述建议,以下是一种使用映射与数组sort方法结合获取最长字符串的方法:

var plorp = ["bbllkw", "oox", "ejjuyyy", "plmiis",
             "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz",
             "qqquuhii", "dvvvwz"];

function getLongestStr() {
  var mapped = plorp.map((el, i) => ({ index: i, length: el }) );
  mapped.sort((a, b) => {

      if (a.length > b.length) {
        return -1;
      }
   
      if (a.length < b.length) {
        return 1;
      }
      return 0;
  });

// DESC order so longest string in 0th element
  return mapped.map((el) => plorp[el.index])[0];
}
console.log( getLongestStr() );

有趣的相关讨论 在这里


1
仅仅为了找到最大值而使用排序是非常笨重的。请查看@Dekel的答案,它可能是最简洁的解决方案。 - Scott Sauyet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接