【问题标题】:Easy way to turn JavaScript array into comma-separated list?将 JavaScript 数组转换为逗号分隔列表的简单方法?
【发布时间】:2010-09-17 03:13:20
【问题描述】:

我有一个 JavaScript 中的一维字符串数组,我想将其转换为逗号分隔的列表。在各种 JavaScript(或 jQuery)中是否有一种简单的方法可以将其转换为逗号分隔的列表? (如果这是唯一的方法,我知道如何遍历数组并自己通过连接构建字符串。)

【问题讨论】:

  • toString():如果您正在寻找最简单的方法,最好像这样使用 toString()var arr = ["Zero", "One", "Two"]; console.log(arr.toString()); 返回 @ 987654323@Read more

标签: javascript


【解决方案1】:

Array.prototype.join() 方法:

var arr = ["Zero", "One", "Two"];

document.write(arr.join(", "));

【讨论】:

  • @Mark: 足够真实,但我需要连接 ID 列表,没有逗号或其他特殊字符的机会
  • @davewilliams459:但你不是 OP? Op 表示“一维字符串数组”。字符串。不是身份证。这意味着它们可以是任何东西。这意味着它们可能包含其他逗号。
  • @Mark:对于所提出的问题,答案是正确的。任何其他要求都留给个人自己解决。 OP 要求提供逗号分隔的列表,而不是引用的 CSV 类型格式。
  • @Wayne:我仍然认为警告是有必要的 :) 人们并不总是把这些事情想清楚,然后他们就在自己的脚下开枪。
  • @Mark - 你的评论是完全有效的(正如其他人用赞成票表示的那样),但更有用的可能是用示例代码实际提供替代答案?
【解决方案2】:

实际上,toString() 实现默认使用逗号进行连接:

var arr = [ 42, 55 ];
var str1 = arr.toString(); // Gives you "42,55"
var str2 = String(arr); // Ditto

我不知道这是否是 JS 规范规定的,但这是大多数几乎所有浏览器似乎都在做的事情。

【讨论】:

  • 还有更短的(但不太清楚)arr + ''
  • array.toString 在逗号后没有空格的情况下完成了这项工作。使用 array.join 你很灵活。
  • toString()join(",") 的性能与 2018 年 4 月大致相当
  • 这是完美的答案。要获取数组的 CSV,我们可以使用 console.log(arr) 或像你说的那样,将其转换为字符串自动使其成为 CSV。
【解决方案3】:

或者(更有效):

var arr = 新数组(3); arr[0] = "零"; arr[1] = "一个"; arr[2] = "两个"; document.write(arr); // 与此上下文中的 document.write(arr.toString()) 相同

数组的 toString 方法在调用时会准确返回您需要的内容 - 逗号分隔的列表。

【讨论】:

【解决方案4】:

如果您需要在最后两项之间使用“和”而不是“,”,您可以这样做:

function arrayToList(array){
  return array
    .join(", ")
    .replace(/, ((?:.(?!, ))+)$/, ' and $1');
}

【讨论】:

    【解决方案5】:

    这是一个将二维数组或列数组转换为正确转义的 CSV 字符串的实现。这些函数不检查有效的字符串/数字输入或列计数(确保您的数组一开始就有效)。单元格可以包含逗号和引号!

    这是script for decoding CSV strings

    这是我的script for encoding CSV strings

    // Example
    var csv = new csvWriter();
    csv.del = '\t';
    csv.enc = "'";
    
    var nullVar;
    var testStr = "The comma (,) pipe (|) single quote (') double quote (\") and tab (\t) are commonly used to tabulate data in plain-text formats.";
    var testArr = [
        false,
        0,
        nullVar,
        // undefinedVar,
        '',
        {key:'value'},
    ];
    
    console.log(csv.escapeCol(testStr));
    console.log(csv.arrayToRow(testArr));
    console.log(csv.arrayToCSV([testArr, testArr, testArr]));
    
    /**
     * Class for creating csv strings
     * Handles multiple data types
     * Objects are cast to Strings
     **/
    
    function csvWriter(del, enc) {
        this.del = del || ','; // CSV Delimiter
        this.enc = enc || '"'; // CSV Enclosure
    
        // Convert Object to CSV column
        this.escapeCol = function (col) {
            if(isNaN(col)) {
                // is not boolean or numeric
                if (!col) {
                    // is null or undefined
                    col = '';
                } else {
                    // is string or object
                    col = String(col);
                    if (col.length > 0) {
                        // use regex to test for del, enc, \r or \n
                        // if(new RegExp( '[' + this.del + this.enc + '\r\n]' ).test(col)) {
    
                        // escape inline enclosure
                        col = col.split( this.enc ).join( this.enc + this.enc );
    
                        // wrap with enclosure
                        col = this.enc + col + this.enc;
                    }
                }
            }
            return col;
        };
    
        // Convert an Array of columns into an escaped CSV row
        this.arrayToRow = function (arr) {
            var arr2 = arr.slice(0);
    
            var i, ii = arr2.length;
            for(i = 0; i < ii; i++) {
                arr2[i] = this.escapeCol(arr2[i]);
            }
            return arr2.join(this.del);
        };
    
        // Convert a two-dimensional Array into an escaped multi-row CSV 
        this.arrayToCSV = function (arr) {
            var arr2 = arr.slice(0);
    
            var i, ii = arr2.length;
            for(i = 0; i < ii; i++) {
                arr2[i] = this.arrayToRow(arr2[i]);
            }
            return arr2.join("\r\n");
        };
    }
    

    【讨论】:

      【解决方案6】:

      简单数组

      let simpleArray = [1,2,3,4]
      let commaSeperated = simpleArray.join(",");
      console.log(commaSeperated);

      具有特定属性的对象数组,以逗号分隔。

      let arrayOfObjects = [
      {
      id : 1,
      name : "Name 1",
      address : "Address 1"
      },
      {
      id : 2,
      name : "Name 2",
      address : "Address 2"
      },
      {
      id : 3,
      name : "Name 3",
      address : "Address 3"
      }]
      let names = arrayOfObjects.map(x => x.name).join(", ");
      console.log(names);

      结果

      Name 1, Name 2, Name 3
      

      【讨论】:

        【解决方案7】:

        我认为应该这样做:

        var arr = ['contains,comma', 3.14, 'contains"quote', "more'quotes"]
        var item, i;
        var line = [];
        
        for (i = 0; i < arr.length; ++i) {
            item = arr[i];
            if (item.indexOf && (item.indexOf(',') !== -1 || item.indexOf('"') !== -1)) {
                item = '"' + item.replace(/"/g, '""') + '"';
            }
            line.push(item);
        }
        
        document.getElementById('out').innerHTML = line.join(',');
        

        fiddle

        基本上它所做的只是检查字符串是否包含逗号或引号。如果是这样,那么它将所有引号加倍,并将引号放在末尾。然后它用逗号连接每个部分。

        【讨论】:

        • 不!很想投反对票。如果引号应该用反斜杠转义怎么办?!它们需要是可变的。 ;)
        • @JoshuaBurns wikipedia 说双引号应该用另一个引号转义,但是没有正式的标准。如果您的 CSV 阅读器需要不同的内容,请随时修改和/或投反对票;)
        • 其实有个RFC,tools.ietf.org/rfc/rfc4180.txt,就是正确的双引号应该用双引号转义。
        • @SteveBuzonas,你刚刚用你的 RFC 为那个人提供了信息。
        【解决方案8】:

        将数组转换为逗号分隔列表的方法有很多

        1。使用数组#join

        来自MDN

        join() 方法将数组(或类似数组的对象)的所有元素连接成一个字符串。

        代码

        var arr = ["this","is","a","comma","separated","list"];
        arr = arr.join(",");
        

        片段

        var arr = ["this", "is", "a", "comma", "separated", "list"];
        arr = arr.join(",");
        console.log(arr);

        2。使用数组#toString

        来自MDN

        toString() 方法返回一个表示指定数组及其元素的字符串。

        代码

        var arr = ["this","is","a","comma","separated","list"];
        arr = arr.toString();
        

        片段

        var arr = ["this", "is", "a", "comma", "separated", "list"];
        arr = arr.toString();
        console.log(arr);

        3。在数组前添加 []+ 或在数组后添加 +[]

        []++[] 会将其转换为字符串

        证明

        ([]+[] === [].toString())
        

        会输出

        console.log([]+[] === [].toString());
        var arr = ["this","is","a","comma","separated","list"];
        arr = []+arr;
        

        片段

        var arr = ["this", "is", "a", "comma", "separated", "list"];
        arr = []+arr;
        console.log(arr);

        还有

        var arr = ["this","is","a","comma","separated","list"];
        arr = arr+[];
        

        var arr = ["this", "is", "a", "comma", "separated", "list"];
        arr = arr + [];
        console.log(arr);

        【讨论】:

          【解决方案9】:

          使用内置的Array.toString方法

          var arr = ['one', 'two', 'three'];
          arr.toString();  // 'one,two,three'
          

          MDN on Array.toString()

          【讨论】:

            【解决方案10】:

            如果该值为nullundefined 等,我通常会发现自己需要一些也跳过该值的东西。

            所以这是适合我的解决方案:

            // Example 1
            const arr1 = ['apple', null, 'banana', '', undefined, 'pear'];
            const commaSeparated1 = arr1.filter(item => item).join(', ');
            console.log(commaSeparated1); // 'apple, banana, pear'
            
            // Example 2
            const arr2 = [null, 'apple'];
            const commaSeparated2 = arr2.filter(item => item).join(', ');
            console.log(commaSeparated2); // 'apple'
            

            如果我的数组看起来像我的第二个示例中的那样,这里的大多数解决方案都会返回 ', apple'。这就是为什么我更喜欢这个解决方案。

            【讨论】:

              【解决方案11】:

              我喜欢https://jsfiddle.net/rwone/qJUh2/ 的解决方案,因为它在逗号后添加了空格:

              array = ["test","test2","test3"]
              array = array.toString();
              array = array.replace(/,/g, ", ");
              alert(array);
              

              或者,正如 cmets 中的@StackOverflaw 所建议的那样:

              array.join(', ');
              

              【讨论】:

              • 一次调用:arr.join(', '),这实际上更快(根据@Sameer cmets),也更安全(不会像结果字符串上的正则表达式那样混淆数组值内的逗号)。 ;)
              • @StockOverflaw 好多了。做同样事情的代码更少,而且更安全、更快。谢谢。
              【解决方案12】:

              Papa Parse 处理值中的逗号和其他极端情况。

              (Node 的Baby Parse 已弃用 - 您现在可以在浏览器和 Node 中使用 Papa Parse。)

              例如。 (节点)

              const csvParser = require('papaparse'); // previously you might have used babyparse
              var arr = [1,null,"a,b"] ;
              var csv = csvParser.unparse([arr]) ;
              console.log(csv) ;
              

              1,,"a,b"

              【讨论】:

                【解决方案13】:
                const arr = [1, 2, 3];
                console.log(`${arr}`)
                

                【讨论】:

                  【解决方案14】:

                  在这里您可以使用任何字符进行分隔,并且可以使用 foreach 获取任何属性列表

                  let taskIds: string = '';    
                  this.checkedTaskList.forEach(res => {
                    taskIds = taskIds + res.taskId.toString() + ','
                  });
                  if (taskIds) {
                      taskIds.substring(0, taskIds.length - 1),**
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    取初始代码:

                    var arr = new Array(3);
                    arr[0] = "Zero";
                    arr[1] = "One";
                    arr[2] = "Two";
                    

                    使用连接函数的初始答案是理想的。要考虑的一件事是字符串的最终用途。

                    为了在某些地方使用文本显示:

                    arr.join(",")
                    => "Zero,One,Two"
                    

                    用于在 URL 中以(有点)RESTful 方式传递多个值:

                    arr.join("|")
                    => "Zero|One|Two"
                    
                    var url = 'http://www.yoursitehere.com/do/something/to/' + arr.join("|");
                    => "http://www.yoursitehere.com/do/something/to/Zero|One|Two"
                    

                    当然,这一切都取决于最终用途。只要牢记数据源和用途,一切都会好起来的。

                    【讨论】:

                      【解决方案16】:

                      你想用“and”结束它吗?

                      针对这种情况,我创建了一个 npm 模块。

                      试试arrford:


                      用法

                      const arrford = require('arrford');
                      
                      arrford(['run', 'climb', 'jump!']);
                      //=> 'run, climb, and jump!'
                      
                      arrford(['run', 'climb', 'jump!'], false);
                      //=> 'run, climb and jump!'
                      
                      arrford(['run', 'climb!']);
                      //=> 'run and climb!'
                      
                      arrford(['run!']);
                      //=> 'run!'
                      


                      安装

                      npm install --save arrford
                      


                      阅读更多

                      https://github.com/dawsonbotsford/arrford


                      自己试试

                      Tonic link

                      【讨论】:

                        【解决方案17】:

                        截至Chrome 72,可以使用Intl.ListFormat

                        const vehicles = ['Motorcycle', 'Bus', 'Car'];
                        
                        const formatter = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
                        console.log(formatter.format(vehicles));
                        // expected output: "Motorcycle, Bus, and Car"
                        
                        const formatter2 = new Intl.ListFormat('de', { style: 'short', type: 'disjunction' });
                        console.log(formatter2.format(vehicles));
                        // expected output: "Motorcycle, Bus oder Car"
                        
                        const formatter3 = new Intl.ListFormat('en', { style: 'narrow', type: 'unit' });
                        console.log(formatter3.format(vehicles));
                        // expected output: "Motorcycle Bus Car"

                        请注意,这种方式还处于早期阶段,因此截至发布此答案之日,预计与旧版本的 Chrome 和其他浏览器不兼容。

                        【讨论】:

                          【解决方案18】:
                          var arr = ["Pro1", "Pro2", "Pro3"];
                          console.log(arr.join());// Pro1,Pro2,Pro3
                          console.log(arr.join(', '));// Pro1, Pro2, Pro3
                          

                          【讨论】:

                            【解决方案19】:
                            var array = ["Zero", "One", "Two"];
                            var s = array + [];
                            console.log(s); // => Zero,One,Two
                            

                            【讨论】:

                            • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
                            【解决方案20】:

                            此解决方案还删除了诸如" " 之类的值:

                            const result = ['', null, 'foo', '  ', undefined, 'bar'].filter(el => {
                              return Boolean(el) && el.trim() !== '';
                            }).join(', ');
                            
                            console.log(result); // => foo, bar
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2018-05-27
                              • 2022-12-10
                              • 1970-01-01
                              • 2017-06-04
                              • 2010-10-14
                              • 1970-01-01
                              • 2015-06-10
                              • 2011-04-26
                              相关资源
                              最近更新 更多