Cách dễ dàng để biến mảng JavaScript thành danh sách được phân tách bằng dấu phẩy?


403

Tôi có một chuỗi các chuỗi một chiều trong JavaScript mà tôi muốn chuyển thành một danh sách được phân tách bằng dấu phẩy. Có một cách đơn giản trong JavaScript (hay jQuery) trong khu vườn để biến nó thành một danh sách được phân tách bằng dấu phẩy? (Tôi biết cách lặp qua mảng và tự xây dựng chuỗi bằng cách ghép nếu đó là cách duy nhất.)


2
toString () : Nếu bạn đang tìm kiếm cách đơn giản nhất, tốt hơn là sử dụng toString () như thế này: var arr = ["Zero", "One", "Two"]; console.log(arr.toString());trả về Zero,One,Two Đọc thêm
Mohammad Musavi

Câu trả lời:


784

Phương thức Array.prototype.join () :

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

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


2
@Mark: đủ đúng nhưng tôi cần ghép danh sách ID, không có cơ hội dấu phẩy hoặc ký tự đặc biệt khác
davewilliams459

11
@ davewilliams459: Nhưng bạn không phải là OP? Op nói "một chuỗi các chiều". Dây. Không phải ID. Điều đó ngụ ý họ có thể là bất cứ điều gì. Có nghĩa là chúng có thể chứa các dấu phẩy khác.
mở

22
@Mark: Câu trả lời là đúng cho câu hỏi khi được hỏi. Bất kỳ yêu cầu nào khác được để lại cho cá nhân để làm việc cho chính họ. OP đã yêu cầu danh sách được phân tách bằng dấu phẩy, không phải định dạng loại CSV được trích dẫn.
Wayne

10
@Wayne: Tôi vẫn nghĩ rằng một cảnh báo là theo thứ tự :) Mọi người không luôn nghĩ những điều này thông qua, và sau đó họ tự bắn vào chân mình sau đó.
mở

13
@Mark - nhận xét của bạn là hoàn toàn hợp lệ (như những người khác đã chỉ ra với một upvote) nhưng hữu ích hơn có thể là thực sự cung cấp câu trả lời thay thế bằng mã ví dụ?
Chris

94

Trên thực tế, việc toString()triển khai thực hiện tham gia với dấu phẩy theo mặc định:

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

Tôi không biết nếu điều này được ủy quyền bởi đặc tả JS nhưng đây là những gì phần lớn khá nhiều trình duyệt dường như đang làm.


1
Ngoài ra còn có phần ngắn hơn (nhưng ít rõ ràng hơn)arr + ''
Oriol

mảng.toString thực hiện công việc mà không có dấu cách sau dấu phẩy. Với mảng.join bạn rất linh hoạt.
jMike

3
hiệu suất toString()join(",")gần tương đương vào tháng 4 năm 2018
MattMcKnight

29

Hoặc (hiệu quả hơn):

var Array = new Array (3);
mảng [0] = "Không";
mảng [1] = "Một";
mảng [2] = "Hai";

document.write (mảng); // giống như document.write (Array.toString ()) trong ngữ cảnh này

Phương thức toString của một mảng khi được gọi trả về chính xác những gì bạn cần - danh sách được phân tách bằng dấu phẩy.


2
Trong hầu hết các trường hợp, toString thực sự chậm hơn so với nối mảng. Nhìn ở đây: jsperf.com/tostring-join
Sameer Alibhai

13

Đây là một triển khai chuyển đổi một mảng hai chiều hoặc một mảng các cột thành một chuỗi CSV được thoát đúng. Các hàm không kiểm tra đầu vào chuỗi / số hợp lệ hoặc số cột (đảm bảo mảng của bạn hợp lệ để bắt đầu). Các tế bào có thể chứa dấu phẩy và dấu ngoặc kép!

Đây là tập lệnh giải mã chuỗi CSV .

Đây là tập lệnh của tôi để mã hóa chuỗi CSV :

// 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");
    };
}

11

Tôi nghĩ rằng điều này nên làm điều đó:

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(',');

vĩ cầm

Về cơ bản, tất cả những gì nó làm là kiểm tra xem chuỗi có chứa dấu phẩy hay dấu ngoặc kép hay không. Nếu có, thì nó nhân đôi tất cả các trích dẫn và đặt dấu ngoặc kép ở cuối. Sau đó, nó nối mỗi phần bằng dấu phẩy.


2
Không! Bị cám dỗ để downvote. Điều gì sẽ xảy ra nếu dấu ngoặc kép được thoát bằng dấu gạch chéo ngược?! Họ cần phải được thay đổi. ;)
Joshua Burns

1
@JoshuaBurns wikipedia nói rằng dấu ngoặc kép nên được thoát bằng một trích dẫn khác, nhưng không có tiêu chuẩn chính thức. Nếu trình đọc CSV của bạn yêu cầu một cái gì đó khác biệt, vui lòng sửa đổi và / hoặc downvote;)
mpen

5
Trên thực tế, có một RFC, tools.ietf.org/rfc/rfc4180.txt và đó là dấu ngoặc kép chính xác cần được thoát với dấu ngoặc kép.
Steve Buzonas

2
@SteveBuzonas, bạn vừa đắm đuối anh chàng đó với RFC của bạn.
devinbost

9

Nếu bạn cần sử dụng "và" thay vì "," giữa hai mục cuối, bạn có thể thực hiện việc này:

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

9

Có nhiều phương pháp để chuyển đổi một mảng thành danh sách được phân tách bằng dấu phẩy

1. Sử dụng mảng # tham gia

Từ MDN

Phương thức jo () kết hợp tất cả các phần tử của một mảng (hoặc một đối tượng giống như mảng) thành một chuỗi.

Mật mã

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

Đoạn trích

2. Sử dụng mảng # toString

Từ MDN

Phương thức toString () trả về một chuỗi đại diện cho mảng đã chỉ định và các phần tử của nó.

Mật mã

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

Đoạn trích

3. Thêm [] + trước mảng hoặc + [] sau một mảng

Các [] + hoặc + [] sẽ chuyển đổi nó thành một chuỗi

Bằng chứng

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

sẽ xuất ra đúng

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

Đoạn trích

Cũng thế

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



3

Tôi thường thấy mình cần cái gì đó cũng bỏ qua giá trị nếu giá trị đó là nullhay undefined, vv

Vì vậy, đây là giải pháp phù hợp với tôi:

// 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'

Hầu hết các giải pháp ở đây sẽ trả về ', apple'nếu mảng của tôi trông giống như trong ví dụ thứ hai của tôi. Đó là lý do tại sao tôi thích giải pháp này.


2

Tôi thích giải pháp tại https://jsfiddle.net/rwone/qJUh2/ vì nó thêm khoảng trắng sau dấu phẩy:

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

Hoặc, như được đề xuất bởi @StackOverflaw trong các bình luận:

array.join(', ');

1
trong một cuộc gọi : arr.join(', '), thực sự nhanh hơn (theo nhận xét của @Sameer) và cũng an toàn hơn (không gây rối với dấu phẩy bên trong các giá trị mảng như RegExp trên chuỗi kết quả). ;)
Chứng khoán tràn vào

@StockOverflaw Cách tốt hơn. Ít mã hơn để làm điều tương tự cộng với an toàn hơn và nhanh hơn. Cảm ơn bạn.
Jaime Montoya

2

Papa Parse xử lý dấu phẩy trong các giá trị và các trường hợp cạnh khác.

( Baby Parse cho Node đã không được chấp nhận - bây giờ bạn có thể sử dụng Papa Parse trong Trình duyệt và trong Nút.)

Ví dụ. (nút)

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"


1

Lấy mã ban đầu:

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

Câu trả lời ban đầu của việc sử dụng chức năng tham gia là lý tưởng. Một điều cần xem xét sẽ là việc sử dụng cuối cùng của chuỗi.

Để sử dụng trong một số hiển thị văn bản cuối:

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

Để sử dụng trong một URL để chuyển nhiều giá trị qua một cách (phần nào) 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"

Tất nhiên, tất cả phụ thuộc vào việc sử dụng cuối cùng. Chỉ cần giữ nguồn dữ liệu và sử dụng trong tâm trí và tất cả sẽ đúng với thế giới.


1

Bạn có muốn kết thúc nó bằng "và" không?

Đối với tình huống này, tôi đã tạo ra một mô-đun npm.

Hãy thử Arrayford :


Sử dụng

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!'


Tải về

npm install --save arrford


Đọc thêm

https://github.com/dawsonbotsford/arrford


Tự mình thử

Liên kết thuốc bổ


1

Kể từ Chrome 72 , có thể sử dụng 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"

Xin lưu ý rằng cách này đang ở giai đoạn rất sớm, vì vậy kể từ ngày đăng câu trả lời này, hãy chờ đợi sự không tương thích với các phiên bản cũ hơn của Chrome và các trình duyệt khác.


0
var arr = ["Pro1", "Pro2", "Pro3"];
console.log(arr.join());// Pro1,Pro2,Pro3
console.log(arr.join(', '));// Pro1, Pro2, Pro3

0
var array = ["Zero", "One", "Two"];
var s = array + [];
console.log(s); // => Zero,One,Two

1
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, điều này làm giảm khả năng đọc của cả mã và các giải thích!
chèo thuyền kayak

0

Giải pháp này cũng loại bỏ các giá trị như " ":

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

console.log(result); // => foo, bar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.