【问题标题】:String.substr() returning entire string?String.substr() 返回整个字符串?
【发布时间】:2019-07-22 08:11:09
【问题描述】:

我正在编写一个应用程序,它可以根据节之间的换行符数将歌词格式化为 Google 幻灯片。为了保持逻辑简单,我一直在测试同一组歌词并找到单词“foo”的索引,并使用该索引创建一个子字符串以推入一个数组。该数组将用于在另一个函数中制作幻灯片。

当我尝试使用单词的索引来做歌词.substr(0, index) 时,它会返回整个字符串,即使是有效的索引号。

function splitLyrics(lyrics) {
  var lyricsArray = []; 
  var lengthOfChunk = 0;
  var lengthOfSong = 0;
  var lyricsToPush;

  while (lyrics.length > 0) {
    Logger.log(lyrics);
    lengthOfSong = lyrics.length;
    lengthOfChunk = lyrics.indexOf('foo');
    Logger.log(lengthOfChunk);

    if (lengthOfChunk = -1) {
      lengthOfChunk = lengthOfSong;
    }

    lyricsToPush = lyrics.substr(0, lengthOfChunk);
    Logger.log(lyricsToPush);
    lyricsArray.push(lyricsToPush);

    lyrics = lyrics.substr(lengthOfChunk + 1);
  }

  return lyricsArray;
}

我希望日志的输出是“原始歌词 blah blah”、索引号,然后是“blah blah”或任何子字符串输出。相反,我得到“原始歌词等等”,索引号,然后是“原始歌词等等”

【问题讨论】:

  • 这里有lengthOfChunk = lyrics.indexOf('foo');吗?您正在寻找'foo' 第一次出现。但是歌词有'blah'
  • 歌词只是一个例子。我使用了一个存在于包含歌词的实际巨大字符串中的实际单词。

标签: javascript google-apps-script substr


【解决方案1】:

您的情况的具体答案在于 if 语句中用于相等性检查的单个 =。它实际上是将lengthOfChunk 的值设置为-1,这意味着它采用lyrics.substr(0) 来返回完整的字符串。

但是,听起来您可以使用lyrics.split("[your word]") 而不必手动填充数组并移动到while 循环中的下一个字符串。如果我没看错,你可以:

splitLyrics = lyrics.split("foo");

这将为您提供一个包含不包括关键字的所有字符串的数组。

【讨论】:

  • 其实更优雅的是这个答案:stackoverflow.com/a/14912552/11780044
  • 谢谢!仍然有点好奇为什么子字符串不能正确返回,但这绝对是解决我不知道的问题的更好方法。
  • lengthOfChunk 的索引值是多少?
  • 有一个问题是单个= 用于lengthOfChunk = -1 的相等性检查。这没有按预期行事。将其切换到== 以查找存储值本身的相等性。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多