繁体   English   中英

当数组作为参数传递并且长度还不存在时,如何利用函数中的数组长度(在JavaScript中)?

[英]How do I utilize the length of an array in a function (in JavaScript) when the array is being passed as a parameter and the length does not exist yet?

我正在尝试编写一个函数,该函数将一个字符串数组( strarr )和一个整数( k )作为参数,并返回由数组中k个连续字符串组成的最长字符串,而不用逗号分隔。 我需要在函数执行过程中经常调用strarr.length ,但是我一直收到错误消息,说它无法读取该参数的长度。

这是我第一次处理此问题,但是我没有找到很好的Internet搜索结果来寻找解决方案。 我怀疑我缺少非常明显的东西。 我尝试将strarr数组参数的值推入新数组,但仍然没有运气。

因此,如果我有const = ['apple','pineapple','banana','strawberry']作为我的strarr参数传递,2作为k传递,则它应该返回'bananastrawberry'因为它是最长的连续字符串对在数组中。

 const arr = ['apple', 'pineapple', 'banana', 'strawberry'] function longestConsec(strarr, k) { if (strarr.length === 0) { return ""; } else if (k > strarr.length) { return ""; } else if (k <= 0) { return ""; } let longest = ""; let strLeng = 0; for (let i = 0; i < strarr.length; i++) { for (let j = i + (k - 1); j > 0; j--) { strLeng += strarr[j].length; } if (strLeng > longest.length) { longest = strarr.slice(i, (i + k)).join(""); } } return longest; } console.log(longestConsec(arr, 2)) 

如前所述,您正在尝试访问数组中不存在的索引。 快速修复方法可能是:

const arr = ['apple', 'pineapple', 'banana', 'strawberry']


function longestConsec(strarr, k) {
  if (strarr.length === 0) {
    return "";
  } else if (k > strarr.length) {
    return "";
  } else if (k <= 0) {
    return "";
  }
  let longest = "";
  let strLeng = 0;
  for (let i = 0; i < strarr.length; i++) {
    for (let j = i + (k - 1); j > 0; j--) {
        if (j >= strarr.length) {
            break;
        }
      strLeng += strarr[j].length;
    }
    if (strLeng > longest.length) {
      longest = strarr.slice(i, (i + k)).join("");
    }
  }
  return longest;
}
console.log(longestConsec(arr, 2))

但我建议您看看是否有比添加break语句更好的解决方案。

你犯的错误

在内部for循环中, for (let j = i + (k - 1); j > 0; j--) ,您从i + k - 1开始计数。 但是,如果i是数组的最后一个索引( strarr.length == 10并且i == 9 )并且k == 2怎么办? 然后,循环从j = 9 + 2 - 1 = 10 strLeng += strarr[10].length j = 9 + 2 - 1 = 10并在下面一行,您尝试执行strLeng += strarr[10].length ,但strarr[10]

在找到最长的字符串之前,似乎也不必创建字符串。 相反,您可以只记住最后一个最长字符串的开始索引。

如何做得更好

让我们看一下需求。 对于数组中的每个i ,您要合并k个连续的字符串并保留最长的组合。 由此得出:

  • i + k - 1不得大于strarr.length 由于i是唯一的变量,因此我们需要通过循环到strarr.length - k + 1来限制它。
  • 如果k == strarr.length ,则只能创建一个字符串strarr.join("")

最后,有一个想法,您可能根本不需要嵌套循环。 对于每个i ,您只需减去当前窗口中最后一个字符串的长度,然后添加一个新字符串。 见图片:

在此处输入图片说明

因此,考虑到这一点,我建议您编写以下版本的代码:

function longestConsec(strarr, k) {
  // Cannot create any joined string with k greater than length
  if(strarr.length < k) {
      return "";
  }
  else if(k <= 0) {
      return "";
  }
  else if(strarr.length == k) {
      return strarr.join("");
  }
  let longestIndex = -1;
  let longestLength = 0;
  // length of our current group of strings
  let currentLength = 0;

  const maxLen = strarr.length;

  for(let i=0; i<maxLen; ++i) {
      // Forget the first strings length
      if(i >= k) {
        currentLength -= strarr[i-k].length;
      }
      // add the current strings length
      currentLength += strarr[i].length;
      // check if this is the largest length and save it's index
      // Only possible after processing at least k strings
      // Eg when i==1, we already went through 2 strings at this point
      if(i >= k-1) {
        if(currentLength > longestLength) {
            const startIndex = i-k+1;
            longestLength = currentLength;
            longestIndex = startIndex;
        }
      }
  }
  return strarr.slice(longestIndex, (longestIndex + k)).join("");
}

这是一个jsFiddle测试: https ://jsfiddle.net/32g5oqd1/2/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM