如何将逗号分隔的字符串转换为数组?

889

我有一个逗号分隔的字符串,想将其转换为数组,以便可以循环遍历。

是否有内置函数可以完成此操作?

例如,我有这个字符串:

var str = "January,February,March,April,May,June,July,August,September,October,November,December";

现在我想通过逗号将其拆分,并将其存储在数组中。


7
只是想评论一下,这并不需要jquery,它是JavaScript本身的一部分。 - Chris
2
可能是重复问题:如何使用JavaScript解析CSV字符串? - gcochard
4
关于重复问题:此前已有18个月之久。如果有什么区别的话,另一个问题不仅是重复的,而且由于需要使用正则表达式,为一个非常简单的问题提供了一个极其复杂的解决方案。 - NotMe
49
简单。string.split(','); - Braden Best
5
不确定为什么被标记为“太过局限”。字符串分割经常出现,而且通常适用于全球互联网的受众(正如我的答案仍然会不时地获得赞同的事实所证明的那样)。我怀疑还会有4个人来重新打开它,但是还是很奇怪。 - Matchu
支持所有类型字符串的最佳实践。请参见此处https://dev59.com/oGYr5IYBdhLWcg3w8-gz#32657055 - Andi AR
20个回答

1473
const array = string.split(',');

MDN 参考文档,对于 limit 参数可能出现的意外行为非常有帮助。(提示: "a,b,c".split(",", 2) 的结果是 ["a", "b"],而不是 ["a", "b,c"]。)


3
很高兴看到JavaScript的string具有一些Java String的丰富性。 - Michael Shopsin
10
如果您确定array中有元素,则split函数可以正常工作。但是,如果您从服务器/数据库中获取数据,则可能会遇到麻烦,因为''.split(',')的长度为1,即[''] - Vlad Goran
@MichaelShopsin和大家好,由于IE11显示无法获取未定义或空引用的'Split'属性,因此split函数无法正常工作。 - DLV
@DLV,这听起来像是一个新问题,也许在查看 StackOverflow 上已有的 IE 问题后再提问会更好。 - Michael Shopsin
这是针对逗号分隔符的,但如果我想用“and”、“,”和“&”来分隔怎么办?你会怎么做? - Prasanna
显示剩余5条评论

146

如果你的目标是整数,比如1、2、3、4、5等,请注意。如果你打算在将字符串分割后将数组的元素用作整数而不是字符串,请考虑将它们转换为整数。

var str = "1,2,3,4,5,6";
var temp = new Array();
// This will return an array with strings "1", "2", etc.
temp = str.split(",");

加入如下循环:

for (a in temp ) {
    temp[a] = parseInt(temp[a], 10); // Explicitly include base as per Álvaro's comment
}

将返回一个包含整数而非字符串的数组。


49
请注意,parseInt() 函数会尝试猜测进制基数,除非您明确设置它。这可能会导致处理前导零 ("001, 002, 003...") 时出现意外结果。请将 parseInt('010')parseInt('010', 10) 进行比较。 - Álvaro González
3
如果可以的话,我会给阿尔瓦罗的评论点赞更多。我学到了这个教训很久以前,从来没有忘记过。 - Antony Scott
2
+1 这个例子更清晰地说明了字符串不是静态对象,而是变量本身就是字符串。 - K0D4
8
map 函数可用于在一行中完成整数解析:str.split(',').map(parseInt) - Jud
1
这不是最有效的解决方案。根据我在Chrome 49下的实验,JSON.parse('[' + str + ']')比这个解决方案快40%。 - Yao
显示剩余6条评论

38

在我看来,split方法是很危险的,因为一个字符串中总是可能包含逗号。请看下面这个例子:

var myArr = "a,b,c,d,e,f,g,','";
result = myArr.split(',');

那么你会如何解释呢?你希望结果是什么?一个包含以下内容的数组:

['a', 'b', 'c', 'd', 'e', 'f', 'g', '\'', '\''] or
['a', 'b', 'c', 'd', 'e', 'f', 'g', ',']

即使您避免了逗号,仍然会有问题。
我很快地把这个东西搞在一起了:
(function($) {
    $.extend({
        splitAttrString: function(theStr) {
            var attrs = [];

            var RefString = function(s) {
                this.value = s;
            };
            RefString.prototype.toString = function() {
                return this.value;
            };
            RefString.prototype.charAt = String.prototype.charAt;
            var data = new RefString(theStr);

            var getBlock = function(endChr, restString) {
                var block = '';
                var currChr = '';
                while ((currChr != endChr) && (restString.value !== '')) {
                    if (/'|"/.test(currChr)) {
                        block = $.trim(block) + getBlock(currChr, restString);
                    }
                    else if (/\{/.test(currChr)) {
                        block = $.trim(block) + getBlock('}', restString);
                    }
                    else if (/\[/.test(currChr)) {
                        block = $.trim(block) + getBlock(']', restString);
                    }
                    else {
                        block += currChr;
                    }
                    currChr = restString.charAt(0);
                    restString.value = restString.value.slice(1);
                }
                return $.trim(block);
            };

            do {
                var attr = getBlock(',', data);
                attrs.push(attr);
            }
            while (data.value !== '')
                ;
            return attrs;
        }
    });
})(jQuery);

2
这对数字也非常有效,我们不必像下面另一个答案中提到的那样运行单独的parseInt循环。这是真正的深度思考。非常感谢,我认为这是所有答案中最好的!! - Anmol Saraf
你的代码很有用,但你没有回答这个问题:“是否有任何内置功能可以做到这一点?”当然,我们可以像你所做的那样编写自定义函数,甚至更好的是导入已经编写和经过充分测试的许多现有库之一(例如jquery-csv)。但是是否有什么内置的东西? - Inigo

31

split() 方法用于将一个字符串分割成子字符串数组,并返回新的数组。

var array = string.split(',');

如果我有变量a =“hello,world,baby”;和变量array = a.split(','); -->结果会是什么?我的数组看起来像这样:array = [“hello”,“world”,“baby”];吗? - pivotal developer
1
是的,没错。结果数组将会和你所提到的一样。 - Jakkwylde
你的答案对我有用,但是我的新数组没有替换旧的。你能帮我吗?var sampleTags = ['vinita@itsabacus.com']; console.log(sampleTags); $("#order_id").on("change", function() { var order_id = document.getElementById('order_id').value; $.ajax({url: "model/getUserMailIds.php",data:{order_id:order_id},type:'POST', success: function(result){ alert(result); var sampleTags = result.split(',');; console.log(sampleTags); }}); }); - Vinita Pawar

24

升级版的str.split(',')

str.split(',')这个简单的函数并没有太多智能性。以下是一些不同需求的升级版,您可以根据自己的需要来定制功能。

const str = "a, b,c,  d  ,e  ,f,,g"
const num = "1, 2,3,  4  ,5  ,6,,7.495"
const mix = "a, 2,3,  d  ,5  ,f,,7.495,g"

console.log(    str.split(',')
) // spaces NOT trimmed, empty values included
  // ["a", " b", "c", "  d  ", "e  ", "f", "", "g"] 

console.log(    str.split(/[ ,]+/)
) // spaces trimmed, empty values skipped
  // ["a", "b", "c", "d", "e", "f", "g"] 

console.log(    str.split(/\s*,\s*/)
) // spaces trimmed, empty values NOT skipped
  // ["a", "b", "c", "d", "e", "f", "", "g"]

console.log(    num.split(',').map(Number)
) // numbers, empty values default to zero
  // [1, 2, 3, 4, 5, 6, 0, 7.495] 

console.log(    num.split(/[ ,]+/).map(Number)
) // numbers, skips empty values
  // [1, 2, 3, 4, 5, 6, 7.495]

console.log(    mix.split(/\s*,\s*/)
                .map(x => (x === '') ? '' : (isNaN(Number(x)) ? x : Number(x)) )
) // mixed values, empty values included
  // ["a", 2, 3, "d", 5, "f", "", 7.495, "g"]

使用JSON.parse

虽然可能感觉有些像黑科技,但它非常简单,并且被大多数JavaScript引擎高度优化。

它还具有一些其他优点,例如支持嵌套列表。但是也有一些缺点,例如需要输入正确格式的JSON。

通过类似我在上面使用string.split的方式,使用string.replace可以修复输入。在下面的前两个示例中,我自定义了如何处理空值:

const num = "1, 2,3,  4  ,5  ,6,,7.495"
const mix = "a, 2,3,  d  ,5  ,f,7.495,g"

console.log(    JSON.parse('['+num.replace(/,\s*,/,',0,')+']')
) // numbers, empty values default to zero
  // [1, 2, 3, 4, 5, 6, 0, 7.495]

console.log(    JSON.parse('['+num.replace(/,\s*,/,',')+']')
) // numbers, skips empty values
  // [1, 2, 3, 4, 5, 6, 7.495]

console.log(    JSON.parse('['+mix.replace(/(^|,)\s*([^,]*[^0-9, ][^,]*?)\s*(?=,|$)/g,'$1"$2"')+']') 
) // mixed values, will ERROR on empty values
  // ["a", 2, 3, "d", 5, "f", "7.495", "g"]  


19

请注意以下内容:

var a = "";
var x = new Array();
x = a.split(",");
alert(x.length);

将会发出警报1


15

将您的逗号分隔字符串传递到这个函数中,它将返回一个数组,如果未找到逗号分隔的字符串,则它将返回null。

function splitTheString(CommaSepStr) {
    var ResultArray = null;

    // Check if the string is null or so.
    if (CommaSepStr!= null) {

        var SplitChars = ',';

        // Check if the string has comma of not will go to else
        if (CommaSepStr.indexOf(SplitChars) >= 0) {
            ResultArray = CommaSepStr.split(SplitChars);

        }
        else {

            // The string has only one value, and we can also check
            // the length of the string or time and cross-check too.
            ResultArray = [CommaSepStr];
        }
    }
    return ResultArray;
}

3
请解释这段代码是如何解决问题的,而不仅仅贴出一大段代码。没有解释,这并不是一个答案。 - Martijn Pieters
1
如果您不确定字符串是否包含拆分值,这是最正确的解决方案。如果字符串没有逗号(如上例所示),此函数将防止拆分方法出错。 - CoryDorning
1
注意:以大写字母开头的函数,大多数情况下都是设计为被调用的。对于不打算被调用的函数最好使用小写字母。 - Jsterman
当我只有一个没有逗号的值时,这个方法对我来说失败了。在第二个“if”之后添加“else { ResultArray = [CommaSepStr]; }”。 - MomasVII

12
这里有一个函数,它可以将一个字符串转换成数组,即使列表中只有一个项目(没有分隔符字符):
function listToAray(fullString, separator) {
  var fullArray = [];

  if (fullString !== undefined) {
    if (fullString.indexOf(separator) == -1) {
      fullArray.push(fullString);
    } else {
      fullArray = fullString.split(separator);
    }
  }

  return fullArray;
}

像这样使用:

var myString = 'alpha,bravo,charlie,delta';
var myArray = listToArray(myString, ',');
myArray[2]; // charlie

var yourString = 'echo';
var yourArray = listToArray(yourString, ',');
yourArray[0]; // echo

5
如果未找到分隔符,不会引发任何错误:'echo'.split(',') 返回 ['echo']''。split(',') 返回 ['']。如果调用了 x.split(',')x 不是字符串(包括 xundefinednull 的情况),则会出错,因为其他类型没有可用的 split 函数。请注意保持原文意思,使翻译更通俗易懂。 - Joel Lee
啊,我看到事实上在编写我的listToArray函数时,我尝试使用未定义的对象split。谢谢你指出来了... - Kabb5

9
let str = "January,February,March,April,May,June,July,August,September,October,November,December"

let arr = str.split(',');

它将产生以下结果:

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

如果您想将以下内容转换为:

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

this:

"January,February,March,April,May,June,July,August,September,October,November,December";

使用:

str = arr.join(',')

8

返回函数

var array = (new Function("return [" + str+ "];")());

它接受字符串和对象字符串:

var string = "0,1";

var objectstring = '{Name:"Tshirt", CatGroupName:"Clothes", Gender:"male-female"}, {Name:"Dress", CatGroupName:"Clothes", Gender:"female"}, {Name:"Belt", CatGroupName:"Leather", Gender:"child"}';

var stringArray = (new Function("return [" + string+ "];")());

var objectStringArray = (new Function("return [" + objectstring+ "];")());

JSFiddle https://jsfiddle.net/7ne9L4Lj/1/


3
文本字符串存在错误 - SyntaxError: Unexpected identifier。数字字符串没有问题。 例如: var stringtext = "String, text, I, am"; var stringtextArray = (new Function("return [" + stringtext + "];")()); 结果为:SyntaxError: Unexpected identifier。 - nycdanie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接