【问题标题】:String split returns an array with more elements than expected (empty elements)字符串拆分返回一个包含比预期更多元素的数组(空元素)
【发布时间】:2012-10-01 21:52:04
【问题描述】:

我不明白这种行为:

var string = 'a,b,c,d,e:10.';
var array = string.split ('.');

我希望这样:

console.log (array); // ['a,b,c,d,e:10']
console.log (array.length); // 1

但我明白了:

console.log (array); // ['a,b,c,d,e:10', '']
console.log (array.length); // 2

为什么返回两个元素而不是一个? split 是如何工作的?

还有其他方法吗?

【问题讨论】:

  • 是的,我真的很讨厌必须省略结尾分隔符。在尝试编写一致的代码或值或只是编辑严格类型的 json 时很烦人

标签: javascript arrays string split


【解决方案1】:

您可以添加过滤器以排除空字符串。

var string = 'a,b,c,d,e:10.';
var array = string.split ('.').filter(function(el) {return el.length != 0});

【讨论】:

  • 请注意 filter() 是一个 ECMAScript 5 数组函数,因此如果您的浏览器不支持此功能,则需要包含其他代码才能使用此功能。请查看here 了解更多信息以及实现此方法所需的代码。
  • 这应该是公认的答案,因为它解决了问题 - 返回预期的结果 - 而不是链接到某些文档。
【解决方案2】:

@xdazz version 的一个稍微简单的版本,用于排除空字符串(使用 ES6 arrow function):

var array = string.split('.').filter(x => x);

【讨论】:

    【解决方案3】:

    这是正确和预期的行为。鉴于您已在字符串中包含分隔符,split 函数(简化)将分隔符左侧的部分 ("a,b,c,d,e:10") 作为第一个元素,并将部分分隔符的其余部分(一个空字符串)作为第二个元素。

    如果您真的对 split() 的工作原理感到好奇,可以查看 ECMA 规范 (ECMA 262) 的第 148 页和第 149 页 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

    【讨论】:

    【解决方案4】:

    String.split() 方法与Array.filter() 方法一起使用。

    var string = 'a,b,c,d,e:10.';
    var array = string.split ('.').filter(item => item);
    
    console.log(array); // [a,b,c,d,e:10]
    console.log (array.length); // 1

    【讨论】:

      【解决方案5】:

      https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/split

      先修剪尾随句点

      'a,b,c,d,e:10.'.replace(/\.$/g,''); // gives "a,b,c,d,e:10"
      

      然后拆分字符串

      var array = 'a,b,c,d,e:10.'.replace(/\.$/g,'').split('.');
      

      console.log (array.length); // 1

      【讨论】:

      • 这只是返回一个字符串 "a,b,c,d,e:10",而不是一个数组,这就是长度为 1 的原因。
      • 嗨@caseyjhol,字符串的长度是 12 而不是 1。对 split 的调用总是返回一个数组,所以长度是 1。我的目的是显示对 split(' 的调用.') 返回一个长度为 1 的数组。我的答案是正确的。
      • 你是对的 - 我误读了原始问题,并认为他试图将其转换为使用逗号作为分隔符的数组。
      【解决方案6】:

      这是因为字符串以 . 字符结尾 - 数组的第二项为空。

      如果字符串根本不包含.,您将获得所需的一项数组。

      split() 方法的工作原理是这样的,我可以用简单的话来解释:

      1. 在给定字符串中查找要分割的给定字符串。如果没有找到,则返回一个包含整个字符串的项目数组。
      2. 如果找到,则遍历给定的字符串,将字符串每两次出现之间的字符作为分割依据。
      3. 如果给定字符串以要分割的字符串开头,则结果数组的第一项将为空。
      4. 如果给定字符串以要分割的字符串结尾,则结果数组的最后一项将为空。

      在技术上更详细地解释了here,所有浏览器几乎都一样。

      【讨论】:

        【解决方案7】:

        根据MDN web docs

        注意:当字符串为空时,split() 返回一个包含 一个空字符串,而不是一个空数组。如果字符串和 分隔符都是空字符串,返回一个空数组。

        const myString = '';
        const splits = myString.split();
        
        console.log(splits); 
        
        // ↪ [""]
        

        【讨论】:

          【解决方案8】:

          好吧,split 做了它应该做的事情,它分割你的字符串。只是拆分的第二部分是空的。

          【讨论】:

            【解决方案9】:

            因为你的字符串由两部分组成:

            1 : a,b,c,d,e:10

            2:空

            如果您尝试在末尾不加点:

            var string = 'a,b,c:10';
            var array = string.split ('.');
            

            输出是:

            ["a,b,c:10"]
            

            【讨论】:

              【解决方案10】:

              你有一个带有一个“.”的字符串。在其中,当您使用 string.split('.') 时,您会收到包含第一个元素的数组,其中包含“。”之前的字符串内容字符和第二个元素与“。”之后的字符串内容。 - 在这种情况下是空字符串。

              所以,这种行为是正常的。你想通过使用这个 string.split 来实现什么?

              【讨论】:

                【解决方案11】:

                试试这个

                javascript通过split函数给出两个数组,然后

                var Val = "abc@gmail.com";
                var mail = Val.split('@');
                
                if(mail[0] && mail[1])  {   alert('valid'); }
                else    {   alert('Enter valid email id');  valid=0;    }
                

                如果两个数组的长度都大于 0,则条件为真

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-12-18
                  • 2015-05-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-09-08
                  • 1970-01-01
                  相关资源
                  最近更新 更多