طريقة سهلة لتحويل مصفوفة جافا سكريبت إلى قائمة مفصولة بفواصل؟

لدي صفيف أحادي الأبعاد من السلاسل النصية في جافا سكريبت التي أريد تحويلها إلى قائمة مفصولة بفواصل. هل هناك طريقة بسيطة لجافا سكريبت متنوعة (أو jQuery) لتحويلها إلى قائمة مفصولة بفواصل؟ (أنا أعرف كيفية التكرار من خلال الصفيف وبناء سلسلة بنفسي بالتسلسل إذا كانت هذه هي الطريقة الوحيدة.)

319
toString() : إذا كنت تبحث عن أبسط طريقة فمن الأفضل استخدام toString() مثل هذا: var arr = ["Zero"، "One" "اثنين"] ؛ console.log (arr.toString ()) ؛ والتي تُرجع Zero، One، Two قراءة المزيد
وأضاف المؤلف Mohammad lm71, مصدر

14 إجابة

Array.prototype.join() :

<div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false"> <div class="snippet-code">

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

document.write(arr.join(", "));
</div> </div>
603
وأضاف
@ davewilliams459: لكنك لست OP؟ وقال اوب "مجموعة من الاوتار ذات البعد الواحد". سلاسل. ليس معرفات. هذا يعني أنه يمكن أن يكون أي شيء. مما يعني أنها قد تحتوي على فواصل أخرى.
وأضاف المؤلف mpen, مصدر
bostIT طالما أنك أكيد لن تظهر أبدًا ، نعم ، هذا حل سهل. أنا فقط أعتقد أنه ينبغي على الأقل أن يذكر في الجواب هو كل شيء.
وأضاف المؤلف mpen, مصدر
@ كريس: لا أعتقد أنني ملزم بتقديم بديل فقط للإشارة إلى العيوب في حل آخر. ومع ذلك ، لدي .
وأضاف المؤلف mpen, مصدر
@ واين: ما زلت أعتقد أن التحذير في النظام :) لا يفكر الناس دائمًا في هذه الأمور ، ثم يطلقون النار على أنفسهم لاحقًا.
وأضاف المؤلف mpen, مصدر
@ مارك ، يمكنك دائما تحديد الاوتار فقط بشيء من المحتمل ألا يظهر في بياناتهم ، مثل "؛؛؛".
وأضاف المؤلف devinbost, مصدر
Mark - تعليقك صحيح تمامًا (كما أوضح الآخرون بعلامة upvote) ولكن ربما كان من المفيد تقديم إجابة بديلة من خلال رمز المثال؟
وأضاف المؤلف Chris, مصدر
@ مارك: الإجابة صحيحة للسؤال كما هو مطلوب. يتم ترك أي متطلبات أخرى للفرد للعمل بها لأنفسهم. طلب OP قائمة مفصولة بفواصل ، وليس بتنسيق CSV من النوع المقتبس.
وأضاف المؤلف Wayne, مصدر
@ مارك: صحيح بما فيه الكفاية ولكني بحاجة إلى تسلسل قائمة المعرفات ، لا توجد فرصة للفواصل أو أحرف خاصة أخرى
وأضاف المؤلف davewilliams459, مصدر

في الواقع ، تنفيذ تنفيذ toString() ارتباط مع الفواصل بشكل افتراضي:

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

لا أعرف ما إذا كان هذا الأمر مفوّضًا وفقًا لمواصفات JS ، لكن هذا هو ما الأكثر إلى حد كبير الذي يبدو أن جميع المتصفحات تقوم به.

80
وأضاف
هناك أيضا أقصر (لكن أقل وضوحا) arr + ''
وأضاف المؤلف Oriol, مصدر
أداء toString() و join ("،") يعادل تقريبًا اعتبارًا من أبريل 2018
وأضاف المؤلف MattMcKnight, مصدر
انضمام الصفيف أسرع jsperf.com/tostring-join
وأضاف المؤلف Sameer, مصدر
array.toString يقوم بالمهمة دون مساحة بعد الفاصلة. مع array.join كنت مرنة.
وأضاف المؤلف jMike, مصدر

أو (بشكل أكثر كفاءة):

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

document.write(arr);//same as document.write(arr.toString()) in this context

تُعيد طريقة toString لصفيف عند استدعاء ما تحتاج إليه بالضبط - قائمة مفصولة بفواصل.

28
وأضاف
في معظم الحالات ، يكون toString أبطأ بالفعل من ارتباط الصفيف. Lookie here: jsperf.com/tostring-join
وأضاف المؤلف Sameer, مصدر

إليك أحد التطبيقات التي تقوم بتحويل مصفوفة ثنائية الأبعاد أو صفيف من الأعمدة إلى سلسلة CSV تم تجاهلها بشكل صحيح. لا تتحقق الوظائف من إدخال سلسلة/رقم صحيح أو عدد الأعمدة (تأكد من أن صفيفك صالح للبدء به). يمكن للخلايا تحتوي على الفواصل والاقتباسات!

إليك نص برمجي لفك شفرة سلاسل 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");
    };
}
13
وأضاف

أعتقد أن هذا يجب أن يفعل ذلك:

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

أساسا كل ما يفعله هو التحقق مما إذا كانت السلسلة تحتوي على فاصلة أو اقتباس. إذا حدث ذلك ، فإنه يضاعف كل علامات الاقتباس ، ويضع علامات الاقتباس على الأطراف. ثم ينضم كل جزء بفاصلة.

10
وأضاف
JoshuaBurns wikipedia يقول أنه يجب إهمال الاقتباسات المزدوجة مع اقتباس آخر ، ولكن هناك لا يوجد معيار رسمي. إذا كان قارئ CSV الخاص بك يتطلب شيئًا مختلفًا ، فلا تتردد في تعديله و/أو خفضه ؛)
وأضاف المؤلف mpen, مصدر
Noooooooooo! يميل إلى downvote. ماذا لو كان يجب هروب الأسعار مع خطوط مائلة عكسية ؟! يجب أن يكونوا متغيرين. ؛)
وأضاف المؤلف Joshua Burns, مصدر
في الواقع ، هناك RFC ، tools.ietf.org/rfc/rfc4180.txt ، وهذا هو الاقتباس الصحيح يجب أن يتم تجاوزه مع علامات اقتباس مزدوجة.
وأضاف المؤلف Steve Buzonas, مصدر
SteveBuzonas ، أنت فقط pwned هذا الرجل مع RFC الخاص بك.
وأضاف المؤلف devinbost, مصدر

استخدم الطريقة Array.toString المضمنة

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

MDN on Array.toString()

6
وأضاف

عادة ما أجد نفسي بحاجة إلى شيء يتخطى القيمة أيضًا إذا كانت هذه القيمة فارغة أو غير محددة ، إلخ.

إذن هذا هو الحل الذي يناسبني:

// 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' إذا كان مصففي سيبدو مثل المصفوفة في المثال الثاني. لهذا السبب أفضل هذا الحل.

3
وأضاف

إذا كنت بحاجة إلى استخدام "و" بدلاً من "،" بين العنصرين الأخيرين ، يمكنك القيام بذلك:

function arrayToList(array){
  return array
    .join(", ")
    .replace(/, ((?:.(?!, ))+)$/, ' and $1');
}
3
وأضاف

هناك العديد من الطرق لتحويل مصفوفة إلى قائمة مفصولة بفواصل

1. باستخدام مجموعة # الانضمام

From MDN

ينضم الأسلوب join() إلى جميع عناصر الصفيف (أو كائن شبيه بالمصفوفة) في سلسلة.

الرمز

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

قصاصة

<div class="قصاصة" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="قصاصة-code قصاصة-currently-hidden">

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

2. باستخدام مجموعة # toString

From MDN

تقوم الدالة toString() بإرجاع سلسلة تمثل الصفيف المحدد وعناصره.

الرمز

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

قصاصة

<div class="قصاصة" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="قصاصة-code قصاصة-currently-hidden">

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

3. أضف [] + قبل الصفيف أو + [] بعد صفيف

سيقوم [] + أو + [] بتحويلها إلى سلسلة

دليل

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

will output true

<div class="قصاصة" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="قصاصة-code قصاصة-currently-hidden">

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

قصاصة

<div class="قصاصة" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="قصاصة-code قصاصة-currently-hidden">

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

أيضا

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

<div class="قصاصة" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="قصاصة-code قصاصة-currently-hidden">

var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr + [];
console.log(arr);
</div> </div>
2
وأضاف
var array = ["Zero", "One", "Two"];
var s = array + [];
console.log(s);//=> Zero,One,Two
1
وأضاف
على الرغم من أن مقتطف الشفرة هذا قد يحل المشكلة ، فإن تضمين شرح يساعد في تحسين الجودة من مشاركتك. تذكر أنك تجيب عن السؤال للقراء في المستقبل ، وقد لا يعرف هؤلاء الأشخاص أسباب اقتراح الرمز الخاص بك. يرجى أيضًا عدم محاولة ازدحام رمزك مع التعليقات التوضيحية ، وهذا يقلل من إمكانية قراءة كل من الشفرة والتفسيرات!
وأضاف المؤلف kayess, مصدر

أخذ الرمز الأولي:

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"

بالطبع ، كل هذا يتوقف على الاستخدام النهائي. ما عليك سوى الاحتفاظ بمصدر البيانات واستخدامه في الاعتبار وسيكون الجميع على حق مع العالم.

1
وأضاف

هل تريد إنهاءها بـ "و"؟

لهذا الوضع ، أنا خلقت وحدة نمطية 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 التثبت --save arrford


اقرأ أكثر

https://github.com/dawsonbotsford/arrford


جربها بنفسك

Tonic link

1
وأضاف
var arr = ["Pro1", "Pro2", "Pro3"];
console.log(arr.join());// Pro1,Pro2,Pro3
console.log(arr.join(', '));// Pro1, Pro2, Pro3
0
وأضاف

Papa Parse (browser based) handles commas in values and other edge cases. Use Baby Parse for Node.

على سبيل المثال. (العقدة)

const csvParser = require('babyparse');
var arr = [1,null,"a,b"] ;
var csv = csvParser.unparse([arr]) ;
console.log(csv) ;

1 ،، "أ، ب"

0
وأضاف