जावास्क्रिप्ट सरणी को अल्पविराम से अलग सूची में बदलने का आसान तरीका?


403

मेरे पास जावास्क्रिप्ट में स्ट्रिंग्स का एक आयामी आयाम है जिसे मैं अल्पविराम से अलग की गई सूची में बदलना चाहूंगा। क्या उद्यान-किस्म के जावास्क्रिप्ट (या jQuery) में एक सरल तरीका है कि इसे अल्पविराम से अलग सूची में बदल दिया जाए? (मुझे पता है कि सरणी के माध्यम से पुनरावृत्ति कैसे करें और अगर यह एकमात्र तरीका है, तो संघनन द्वारा स्ट्रिंग का निर्माण करें।)


2
.String () : यदि आप सबसे सरल तरीके की तलाश कर रहे हैं , तो इस तरह का उपयोग करना बेहतर है () : var arr = ["Zero", "One", "Two"]; console.log(arr.toString());जो कि Zero,One,Two अधिक पढ़ें
मोहम्मद मुसावी

जवाबों:


784

Array.prototype.join () विधि:

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

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


2
@ मर्क: काफी हद तक सही लेकिन मुझे आईडी की सूची, कॉमा या अन्य विशेष वर्णों का कोई मौका नहीं चाहिए
davewilliams459

11
@ davewilliams459: लेकिन आप ओपी नहीं हैं? ओप ने कहा "स्ट्रिंग्स का एक आयामी आयाम"। स्ट्रिंग्स। आईडी नहीं। इसका मतलब है कि वे कुछ भी हो सकते हैं। जिसका अर्थ है कि उनमें अन्य अल्पविराम हो सकते हैं।

22
@ मर्क: पूछे गए प्रश्न के लिए उत्तर सही है। किसी भी अन्य आवश्यकताओं को व्यक्ति को खुद के लिए काम करने के लिए छोड़ दिया जाता है। ओपी ने अल्पविराम से अलग की गई सूची के लिए कहा, न कि उद्धृत सीएसवी-प्रकार प्रारूप।
वेन

10
@Wayne: मुझे अभी भी लगता है कि एक चेतावनी क्रम में है :) लोग हमेशा इन चीजों के बारे में नहीं सोचते हैं, और फिर बाद में खुद को गोली मार लेते हैं।
22

13
@ मर्क - आपकी टिप्पणी पूरी तरह से मान्य है (जैसा कि अन्य लोगों ने संकेत दिया है) लेकिन अधिक उपयोगी वास्तव में उदाहरण कोड के साथ वैकल्पिक उत्तर प्रदान करने में हो सकता है?
क्रिस

94

दरअसल, toString()कार्यान्वयन डिफ़ॉल्ट रूप से अल्पविराम से जुड़ता है:

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

मुझे नहीं पता कि यह जेएस कल्पना द्वारा अनिवार्य है लेकिन यह क्या है अधिकांश बहुत सारे ब्राउज़र कर रहे हैं।


1
वहाँ भी कम (लेकिन कम स्पष्ट) हैarr + ''
ओरिओल

array.toString कॉमा के बाद बिना स्पेस के काम करता है। Array.join के साथ आप लचीले होते हैं।
jMike

3
के प्रदर्शन toString()और join(",")के अप्रैल 2018 के रूप में मोटे तौर पर बराबर है
MattMcKnight

29

या (अधिक कुशलता से):

var गिरफ्तारी = नया ऐरे (3);
गिरफ्तार [0] = "शून्य";
arr [1] = "वन";
arr [2] = "टू";

(आगमन) document.write; // इस संदर्भ में document.write (arr.toString ()) के समान है

किसी सरणी की स्ट्रींग पद्धति जब रिटर्न कहती है तो आपको वही चाहिए - अल्पविराम से अलग की गई सूची।


2
ज्यादातर मामलों में, स्ट्राइंग वास्तव में एरे जॉइन की तुलना में धीमी है। यहाँ देखें: jsperf.com/tostring-join
समीर

13

यहां एक कार्यान्वयन है जो दो आयामी सरणी या स्तंभों के एक सरणी को एक अच्छी तरह से बची हुई सीएसवी स्ट्रिंग में परिवर्तित करता है। फ़ंक्शन मान्य स्ट्रिंग / संख्या इनपुट या स्तंभ की गणना के लिए जाँच नहीं करते हैं (सुनिश्चित करें कि आपका सरणी शुरू होने के लिए वैध है)। कोशिकाओं में अल्पविराम और उद्धरण शामिल हो सकते हैं!

CSV स्ट्रिंग्स को डिकोड करने की स्क्रिप्ट यहां दी गई है ।

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

मुझे लगता है कि यह करना चाहिए:

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

बेला

मूल रूप से यह सब जांचता है कि क्या स्ट्रिंग में अल्पविराम या उद्धरण है। यदि ऐसा होता है, तो यह सभी उद्धरणों को दोगुना कर देता है, और उद्धरणों को समाप्त होता है। फिर यह प्रत्येक भाग को अल्पविराम से जोड़ता है।


2
Noooooooooo! उतार चढ़ाव के लिए। क्या होगा अगर उद्धरण backslashes के साथ बच जाना चाहिए ?! उन्हें परिवर्तनशील होने की आवश्यकता है। ;)
जोशुआ बर्न्स

1
@JoshuaBurns विकिपीडिया का कहना है कि दोहरे उद्धरण चिह्नों को दूसरे उद्धरण से बच जाना चाहिए, लेकिन कोई औपचारिक मानक नहीं है। यदि आपके CSV रीडर को कुछ अलग करने की आवश्यकता है, तो बेझिझक संशोधित करें और / या नीचे करें;)
mpen

5
वास्तव में एक RFC है, tools.ietf.org/rfc/rfc4180.txt , और यह सही है कि दोहरे उद्धरणों को दोहरे उद्धरण चिह्नों से बच जाना चाहिए।
स्टीव बुज़ोनस

2
@SteveBuzonas, आपने अपने RFC के साथ बस उस आदमी को पोज़ दिया।
डेविनबॉस्ट

9

यदि आपको अंतिम दो वस्तुओं के बीच "और" के बजाय "," का उपयोग करने की आवश्यकता है, तो आप यह कर सकते हैं:

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

9

किसी सरणी को अल्पविराम से अलग सूची में बदलने के लिए कई तरीके हैं

1. सरणी # जुड़ने का उपयोग करना

से MDN

ज्वाइन () विधि एक अरेंज (या एरे-लाइक ऑब्जेक्ट) के सभी तत्वों को एक स्ट्रिंग में जोड़ती है।

कोड

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

टुकड़ा

2. सरणी #String का उपयोग करना

से MDN

TheString () विधि निर्दिष्ट सरणी और उसके तत्वों का प्रतिनिधित्व करने वाली स्ट्रिंग लौटाती है।

कोड

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

टुकड़ा

3. सरणी के बाद सरणी या + [] से पहले जोड़ें] []

[] + या + [] एक स्ट्रिंग में परिवर्तित कर देंगे

सबूत

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

सच उत्पादन होगा

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

टुकड़ा

भी

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



3

मैं आमतौर पर अपने आप को कुछ है कि यह भी मूल्य को छोड़ देता है, तो है कि मूल्य है की आवश्यकता होगी, लगता है nullया undefined, आदि

तो यहाँ समाधान है कि मेरे लिए काम करता है:

// 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'यदि मेरा सरणी मेरे दूसरे उदाहरण में दिखाई देगा तो यहां अधिकांश समाधान वापस आ जाएंगे। इसलिए मैं इस समाधान को पसंद करता हूं।


2

मुझे https://jsfiddle.net/rwone/qJUh2/ पर समाधान पसंद आया क्योंकि यह कॉमा के बाद रिक्त स्थान जोड़ता है:

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

या, जैसा कि @StackOverflaw ने सुझाव दिया है:

array.join(', ');

1
एक कॉल में: arr.join(', ')जो वास्तव में तेज़ (@Sameer टिप्पणियों के अनुसार) है, और सुरक्षित भी है (सरणी मूल्यों के अंदर अल्पविराम के साथ गड़बड़ नहीं करता है क्योंकि परिणामी स्ट्रिंग पर RegExp होगा)। ;)
स्टॉक ओवरफ्लो

@StockOverflaw वे बेहतर। कम कोड एक ही काम करने के लिए प्लस सुरक्षित और तेज। धन्यवाद।
Jaime Montoya

2

पापा परसे मूल्यों और अन्य धार मामलों में कॉमा को संभालते हैं।

( बेबी पार्स नोड के लिए को पदावनत कर दिया गया है - अब आप ब्राउज़र और नोड में पापा पार्स का उपयोग कर सकते हैं।)

उदाहरण के लिए। (नोड)

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 ,, "ए, बी"


1

प्रारंभिक कोड लेना:

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

जॉइन फ़ंक्शन का उपयोग करने का प्रारंभिक उत्तर आदर्श है। एक बात पर विचार करना स्ट्रिंग का अंतिम उपयोग होगा।

कुछ अंतिम पाठ प्रदर्शन में उपयोग के लिए:

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

(कुछ हद तक) रीस्टफुल तरीके से कई मान पास करने के लिए URL में उपयोग करने के लिए:

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"

बेशक, यह सब अंतिम उपयोग पर निर्भर करता है। बस डेटा स्रोत और उपयोग को ध्यान में रखें और सभी दुनिया के साथ सही होगा।


1

क्या आप इसे "और" के साथ समाप्त करना चाहते हैं?

इस स्थिति के लिए, मैंने एक npm मॉड्यूल बनाया।

गिरफ्तारी का प्रयास करें :


प्रयोग

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


इसे स्वयं आज़माएं

टॉनिक लिंक


1

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 और अन्य ब्राउज़र के पुराने संस्करणों के साथ असंगति की अपेक्षा करें।


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
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया अपने कोड को व्याख्यात्मक टिप्पणियों के साथ भीड़ न दें, इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
kayess

0

यह समाधान मानों को भी हटाता है जैसे " ":

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

console.log(result); // => foo, bar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.