【问题标题】:Return longest string in array (JavaScript) [duplicate]返回数组中最长的字符串(JavaScript)[重复]
【发布时间】:2018-02-17 22:19:27
【问题描述】:

所以我试图在字符串数组中找到最长的字符串。在我必须返回最长字符串的长度之前,我已经做过类似的问题。问题是,我的代码可以正常工作并返回 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].lengthreturn arr[long1]
  • @the4akman 你不正确。 long1 包含最长长度而不是索引。所以arr[long1] 很可能是未定义的。

标签: javascript arrays string for-loop


【解决方案1】:

您可以改用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);

【讨论】:

  • 简洁的 ES6 1-liner:plorp.reduce((p, c) =&gt; p.length &gt; c.length ? p : c).
  • @Andy 感谢您的回复。我正在考虑将其写为 ES6,但不确定 OP 是否可以在他的环境中使用 ES6 ......也将其添加到答案中。谢谢!
  • 这太棒了!我对 ES6 有点陌生,但这很有意义。另外,我是女孩:)
【解决方案2】:

只需比较字符串的长度,然后将字符串本身赋给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));

【讨论】:

    【解决方案3】:

    只需将长声明更改为:

    var long1= '';
    

    在for循环条件下应该是

    arr[i].length > long1.length
    

    【讨论】:

      【解决方案4】:

      在用户想要更基本的解决方案后更新

      在这里,我们使用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));
      

      【讨论】:

      • 好极了,但有没有办法让它更实用又不那么冗长?
      • 是的,我已经为你更新了@GismoRanas
      • 我最终找到了自己的解决方案,并将其写在下面。谢谢!
      【解决方案5】:

      问题出在你设置的时候

      long1=arr[i];
      

      然后你比较整数值的长度。

      在第一次迭代时,您将整数值 0 与第一个字符串的长度进行比较,这当然会使比较表达式结果为真,然后您设置

       long1=arr[0];
      

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

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

      您需要将long1 初始化为空字符串,并按照belhadj 的回答建议使用long1.length 进行比较。

      【讨论】:

        【解决方案6】:

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

        根据 compareFunction 的性质,这可能会产生高 高架。 compareFunction 所做的工作越多,元素就越多 有排序,考虑使用地图可能更明智 排序。

        所以,根据前面的建议,这里有一种方法是使用 map 结合数组的 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() );

        有趣的相关讨论here

        【讨论】:

        • 使用排序只是为了找到最大值是非常重量级的。请参阅@Dekel 的答案,它可能会尽可能干净。
        【解决方案7】:

        var arr = [“第一”、“第二”、“第三”、“第四”、“千”]

        函数 getLongestString(arr) { 让longestStringArr = arr.sort((a, b) => a.length - b.length).reverse(); 返回最长字符串Arr[0]; }

        console.log(getLongestString(arr))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-22
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多