【问题标题】:Truncate string after the cutting word in Javascript在Javascript中剪切单词后截断字符串
【发布时间】:2019-07-30 19:55:07
【问题描述】:

我想在 javascript 中截断特定字符长度后的字符串。当达到字符长度时,不应在单词中间剪切字符串,而应完成单词然后截断字符串。 我到目前为止所尝试的内容是在切割词之前切割字符串。我想在返回的字符串中包含切割词。这是我的代码:

function truncateString(yourString, maxLength) {
  var trimmedString = yourString.substr(0, maxLength);
  trimmedString = trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf(" ")));
  return trimmedString;
}

现在当我使用以下参数调用此函数时:

truncateString('The quick brown fox jumps over the lazy dog',6)

输出为'The' rather than 'The quick

请指出我需要更改的内容。 谢谢

【问题讨论】:

标签: javascript


【解决方案1】:

您可以使用indexOf的第二个参数搜索maxLength之后的紧邻空格的索引

function truncateString(yourString, maxLength) {
  // get the index of space after maxLength
  const index = yourString.indexOf(" ", maxLength);
  return index === -1 ? yourString : yourString.substring(0, index)
}

const str = 'The quick brown fox jumps over the lazy dog';

console.log(truncateString(str,6))
console.log(truncateString(str,10))
console.log(truncateString(str,100))

【讨论】:

  • 嗯..不知道这个功能。您的答案可能比我的要好:p 但是在使用 substring 之前,您应该比 index != -1 进行测试
【解决方案2】:

另一种方法是使用正则表达式。

您可以根据传递给函数的值构建正则表达式模式。

^.{${value}}.*?\\b
       |     |_____________ expression to get value upto next word boundry
       |
       |___________________ Value passed to function

let trmStr = (input,value) => {
  let reg = `^.{${value}}.*?\\b`
  let regex = new RegExp(reg)
  return input.match(regex)
}

console.log(trmStr('The quick brown fox jumps over the lazy dog', 6))

【讨论】:

    【解决方案3】:

    只要 maxLength 在非空白字符上,就增加它。

    function truncateString(yourString, maxLength) {
      while (maxLength < yourString.length && yourString[maxLength] != ' '){
        maxLength++;
      }
      
      return yourString.substr(0, maxLength);
    }
    
    console.log(
      truncateString('The quick brown fox jumps over the lazy dog',6)
    )

    【讨论】:

      【解决方案4】:

      在你的例子中:

      trimmedString // "The qu"
      trimmedString.length // 6
      trimmedString.lastIndexOf(" ") // 3
      Math.min(trimmedString.length, trimmedString.lastIndexOf(" ") // 3
      

      所以目前你转到当前单词之前出现的空格,而不是它之后的空格。


      这是一个潜在的解决方案:

      1. 通过查找出现在maxLength 上或之后的第一个空格 (" ") 的索引来查找endIndex(请参阅indexOf
      2. 返回在endIndex之前结束的子字符串

      【讨论】:

      • 很好地解释了哪里出了问题并体面地指导解决方案!
      【解决方案5】:

      你可以用reduce函数来做。在未达到总长度时添加单词。

      function truncateString(yourString,maxLength)
      {
         return yourString.split(' ').reduce((acc, str) => { return (acc.length < maxLength) ? acc + " " + str : acc  }, '')
      }
      console.log(truncateString('The quick brown fox jumps over the lazy dog',6))

      【讨论】:

      • 这样做的一个小缺点是它会在达到长度后继续迭代很长时间。可能没什么大不了的,但你永远不会知道。
      • 我担心我的回答,我认为阿迪加的更好。我正在寻找一种停止减少功能的解决方案(中断或返回在这里不起作用:/)
      • 非常有趣。我永远不会在那里使用公认的解决方案,但我也根本不会想到它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多