JavaScript dizisini virgülle ayrılmış listeye dönüştürmenin kolay yolu?


403

Virgülle ayrılmış bir listeye dönüştürmek istediğim JavaScript'te dizelerin tek boyutlu dizisi var. Bahçe çeşitliliği olan JavaScript'te (veya jQuery'de) virgülle ayrılmış bir listeye dönüştürmenin basit bir yolu var mı? (Dizi tekrarı ve tek yol ise birleştirme ile kendimi dize oluşturmak biliyorum.)


2
() toString : Eğer basit şekilde arıyorsanız kullanmak daha iyidir toString () böyle: var arr = ["Zero", "One", "Two"]; console.log(arr.toString());döndüren Zero,One,Two Devamı bağlantısına
Mohammad Musavi

Yanıtlar:


784

Array.prototype.join () metodu:

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

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


2
@Mark: yeterince doğru ama kimlik listesi, virgül veya diğer özel karakterlerin şansını birleştirmem gerekiyor
davewilliams459

11
@ davewilliams459: Ama OP sen değilsin? Op, "tek boyutlu bir dizi dizi" dedi. Teller. Kimlikler değil. Bu onların herhangi bir şey olabileceğini ima ediyor. Bu, başka virgüller içerebileceği anlamına gelir.
mpen

22
@ Mark: Yanıt, sorulduğu gibi soru için doğrudur. Kendileri için çalışmak için diğer gereklilikler bireye bırakılmıştır. OP, alıntılanmış bir CSV türü biçimi değil, virgülle ayrılmış bir liste istedi.
Wayne

10
@Wayne: Sanırım hala bir uyarı var :) İnsanlar her zaman bu şeyleri düşünmezler ve daha sonra kendilerini ayağa vururlar.
mpen

13
@Mark - yorumunuz mükemmel şekilde geçerlidir (diğerleri bir oylama ile belirtildiği gibi), ancak alternatif cevabı örnek kodla sağlamak gerçekten daha yararlı olabilir mi?
Chris

94

Aslında, toString()uygulama varsayılan olarak virgüllerle birleştirme yapar:

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

Bu JS spec tarafından zorunlu olup olmadığını bilmiyorum ama bu ne çoğu hemen hemen tüm tarayıcılar yapıyor gibi görünüyor.


1
Ayrıca daha kısa (ama daha az net) vararr + ''
Oriol

array.toString işi virgülden sonra boşluk bırakmadan yapar. Array.join ile esnek olursunuz.
jMike

3
performansı toString()ve join(",")Nisan 2018 itibariyle kabaca eşdeğer
MattMcKnight

29

Veya (daha verimli):

var arr = yeni Dizi (3);
arr [0] = "Sıfır";
arr [1] = "Bir";
arr [2] = "İki";

(Arr) document.write; // bu bağlamda document.write (arr.toString ()) ile aynı

Bir dizinin toString yöntemi çağrıldığında tam olarak ihtiyacınız olanı döndürür - virgülle ayrılmış liste.


2
Çoğu durumda, toString aslında dizi birleştirmeden daha yavaştır. Lookie
Sameer

13

İki boyutlu bir diziyi veya bir sütun dizisini düzgün bir şekilde kaçan bir CSV dizesine dönüştüren bir uygulama. İşlevler geçerli dize / sayı girişi veya sütun sayılarını kontrol etmez (dizinizin başlangıç ​​için geçerli olduğundan emin olun). Hücreler virgül ve tırnak içerebilir!

İşte CSV dizelerini çözmek için bir komut dosyası .

İşte CSV dizelerini kodlamak için benim komut dosyası :

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

Bunun yapması gerektiğini düşünüyorum:

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

Vaktini boşa harcamak

Temel olarak tek yaptığı dizenin virgül veya tırnak işareti olup olmadığını kontrol etmek. Varsa, tüm tırnak işaretlerini iki katına çıkarır ve tırnak uçlarına koyar. Daha sonra her bir parçayı virgülle birleştirir.


2
Noooooooooo! Aşağı oy için cazip. Tırnak işaretleri ters eğik çizgilerden kaçarsa ne olur ?! Değişken olmaları gerekir. ;)
Joshua Burns

1
@JoshuaBurns wikipedia , çift tırnaklardan başka bir alıntıyla kaçılması gerektiğini söylüyor, ancak resmi bir standart yok. CSV okuyucunuz farklı bir şey gerektiriyorsa, değiştirmekten ve / veya indirmekten çekinmeyin;)
14'te 0:17

5
Aslında bir RFC, tools.ietf.org/rfc/rfc4180.txt vardır ve doğru olan çift tırnak çift tırnak ile kaçmalıdır .
Steve Buzonas

2
@SteveBuzonas, şu adamı RFC'nizle birlikte aldınız.
devinbost

9

Son iki öğe arasında "yerine" ve "yerine" kullanmanız gerekiyorsa bunu yapabilirsiniz:

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

9

Bir diziyi virgülle ayrılmış listeye dönüştürmenin birçok yöntemi vardır

1. # join dizisini kullanma

Gönderen MDN'yi

Join () yöntemi, bir dizinin (veya dizi benzeri bir nesnenin) tüm öğelerini bir dizeye ekler.

Kod

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

Pasaj

2. toString dizisini kullanma

Gönderen MDN'yi

ToString () yöntemi, belirtilen diziyi ve öğelerini temsil eden bir dize döndürür.

Kod

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

Pasaj

3. Diziden önce [] + veya diziden sonra + [] ekleyin

[] + Veya + [] bir dizeye dönüştürmek olacak

Kanıt

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

doğru çıktı verecek

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

Pasaj

Ayrıca

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



3

Genellikle kendimi bu değer nullveya undefinedvb. İse değeri atlayan bir şeye ihtiyaç duyuyorum .

İşte benim için çalışan çözüm:

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

Dizim ', apple'ikinci örneğiminki gibi görünürse , buradaki çözümlerin çoğu geri dönecektir . Bu yüzden bu çözümü tercih ederim.


2

Virgüllerden sonra boşluk eklediğinden çözümü https://jsfiddle.net/rwone/qJUh2/ adresinden beğendim :

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

Veya yorumlarda @StackOverflaw tarafından önerildiği gibi:

array.join(', ');

1
bir çağrıda: arr.join(', ')aslında daha hızlı (@Sameer yorumlarına göre) ve daha güvenli (sonuç değerleri dizesinde RegExp gibi dizi değerleri içindeki virgüllerle uğraşmaz). ;)
Stok Overflaw

@StockOverflaw Yolu daha iyi. Aynı şeyi yapmak için daha az kod, daha güvenli ve daha hızlı. Teşekkür ederim.
Jaime Montoya

2

Papa Parse , virgülleri değerler ve diğer uç durumlarda ele alır.

( Düğüm için Bebek Ayrıştırma kullanımdan kaldırıldı - artık Tarayıcıda ve Düğümde Papa Ayrıştırma'yı kullanabilirsiniz.)

Örneğin. (Düğüm)

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

İlk kodu alma:

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

Birleştirme işlevini kullanmanın ilk cevabı idealdir. Dikkate alınması gereken bir şey, dizenin nihai kullanımı olacaktır.

Bazı son metin göstergelerinde kullanmak için:

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

Bir URL'yi birden fazla değeri RESTful tarzında geçirmek için kullanmak için:

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"

Tabii ki, hepsi son kullanıma bağlı. Sadece veri kaynağını ve aklınızda bulundurun ve tüm dünya ile doğru olacaktır.


1

Bir "ve" ile bitirmek ister misiniz?

Bu durum için bir npm modülü oluşturdum.

Arrford'u deneyin :


kullanım

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


Yüklemek

npm install --save arrford


Daha fazla oku

https://github.com/dawsonbotsford/arrford


Kendin dene

Tonik bağlantı


1

İtibariyle Chrome 72 , bu kullanım mümkündür 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"

Lütfen bu yolun daha erken bir aşamada olduğunu unutmayın, bu nedenle bu yanıtı yayınlama tarihi itibariyle Chrome'un eski sürümleriyle ve diğer tarayıcılarla uyumsuzluk bekleyebilirsiniz.


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
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama dahil olmak , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
kayess

0

Bu çözüm aşağıdaki gibi değerleri de kaldırır " ":

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

console.log(result); // => foo, bar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.