【问题标题】:Splitting 2 strings with different lengths returns the same value拆分 2 个不同长度的字符串返回相同的值
【发布时间】:2019-11-30 13:03:03
【问题描述】:

var strings1 = ("https://www.letsgodeep.com/deep/deeper/deepest/").split('/')
var strings2 = ("https://www.letsgodeep.com/deep/deeper/deepest/bottom").split('/')
console.log(Object.keys(strings1).length)
console.log(Object.keys(strings2).length)

这两个都返回 7。我假设这是因为字符串 2 不以 '/' 结尾,但通常情况会如此。我想不出一个简单的方法来判断我是否有 string1 或 string2。直到并包括“更深”的所有内容始终具有相同的价值。

更新:感谢您的帮助。 JD 的回答是个好主意,但 hngr18 的解决方案满足了我的需要。 (仔细检查我们是否在正确的路径上 && 如果长度大于 6,我们就在“底部”)

if ((location.href).split('/')[3] == 'deep' && Array.from(new Set(location.href.split('/'))).length > 6)

【问题讨论】:

  • 好吧,strings1.endsWith('/') === true
  • 你可以去掉斜杠或者检查最后一个字符串是否以斜杠结尾
  • 操作相同长度的数组并不意味着这些数组的包含相同。 AFAIU,对于第一个strings1,数组中的最后一个字符串将为空,而对于strings2,las 字符串将为bottom

标签: javascript


【解决方案1】:

这是因为在使用split 时,如果最后一个字符与您要拆分的字符相同,它会返回一个空字符串并将其添加到数组中。

所以,是的,这是正确的。解决此问题的一种方法是 filter 你的结果通过测试值是否为假来删除空字符串。

var string1 = ("https://www.letsgodeep.com/deep/deeper/deepest/").split('/')
var string2 = ("https://www.letsgodeep.com/deep/deeper/deepest/bottom").split('/')

alert(string1.filter(_=>_).length)
alert(string2.filter(_=>_).length)

【讨论】:

    【解决方案2】:

    你可以规范化字符串。如果有尾随/,则将其删除。那么你的方法会很好用!

    【讨论】:

      【解决方案3】:

      由于数组strings2中的最后一项是“”(空字符串)并且已经有一个来自http://的“”,所以使用Array.from和一个新的集合,这些数据项去重复并返回更忠实的价值观

      console.log(Array.from(new Set(strings1)).length);
      

      返回 6

      console.log(Array.from(new Set(strings2)).length);
      

      返回 7

      【讨论】:

      • 看起来有点矫枉过正:)
      • 对我来说感觉比将 url 标准化为是否都有'/'要好一些
      • 我同意这是一种思考强硬的好方法资源明智它制作 4 个数组和 2 个集合而不是 1 个简单的字符串操作或均衡...
      【解决方案4】:

      您可以检查拆分后的数组的最后一项是否为空。

      if(string1[string1.length-1]!="")
         yourString = string2;
      else
         yourString = string1;
      

      或者您可以从字符串中删除最后一个 (/)。 然后你就可以拆分检查了。

      var strings1 = "https://www.letsgodeep.com/deep/deeper/deepest/";
      var strings2 = "https://www.letsgodeep.com/deep/deeper/deepest/bottom";
      if (strings1.substring(strings1.length-1) == "/")
          strings1 = strings1.substring(0, strings1.length-1);
      strings1 = strings1.split('/');
      strings2 = strings2.split('/');
      console.log(Object.keys(strings1).length)
      console.log(Object.keys(strings2).length)

      【讨论】:

        【解决方案5】:

        我认为你可以使用正则表达式

        console.log("https://www.letsgodeep.com/deep/deeper/deepest/".match(/\/\S/ig).length); // 4
        console.log("https://www.letsgodeep.com/deep/deeper/deepest/bottom".match(/\/\S/ig).length); // 5
        

        希望对你有帮助

        【讨论】:

          【解决方案6】:

          检查它是否以斜线结尾是一种简单的方法。 str.endsWith('/') 应该这样做。

          你知道'a/b/'.split('/') 返回[ 'a', 'b', '' ]吗?在最后一个/ 之后有一个空字符串。

          如果最后一个元素是空字符串,那么您可以断定您的原始字符串以/ 结尾。 (或者原来的只是空字符串。)

          对了,还有a very popular way to remove the empties described here,如果需要测试后去掉,看看最后一个是否为空。

          ...这基本上涉及过滤出 falsey 的字符串。 (空字符串''falsey。)例如,'a/b/'.split('/').filter(x=>x) 只返回[ 'a', 'b' ]

          但是要小心,因为如果你过滤空,那么你就无法区分a/ba//b

          【讨论】:

            猜你喜欢
            • 2018-12-28
            • 1970-01-01
            • 2012-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多