วิธีการแปลงสตริงที่คั่นด้วยเครื่องหมายจุลภาคเป็นอาร์เรย์?


720

ฉันมีสตริงที่คั่นด้วยเครื่องหมายจุลภาคที่ฉันต้องการแปลงเป็นอาร์เรย์ดังนั้นฉันจึงสามารถวนรอบมันได้

มีอะไรในตัวที่จะทำเช่นนี้?

สำหรับเช่นฉันมีสายนี้

var str = "January,February,March,April,May,June,July,August,September,October,November,December";

ตอนนี้ฉันต้องการแยกโดยใช้เครื่องหมายจุลภาคแล้วเก็บไว้ในอาร์เรย์


7
แค่ต้องการแสดงความคิดเห็นว่านี่ไม่จำเป็นต้องมี jquery นี่เป็นส่วนหนึ่งของจาวาสคริปต์เอง
Chris

2
มีความเป็นไปได้ที่ซ้ำกันของฉันจะแยกสตริง CSV ด้วย Javascript ได้อย่างไร
gcochard

4
เกี่ยวกับสิ่งที่ซ้ำกัน: สิ่งนี้มีมาก่อนคำถามอ้างอิงภายใน 18 เดือน หากมีสิ่งใดที่อื่น ๆ ไม่ได้เป็นเพียงล่อลวง แต่เสนอทางออกที่ซับซ้อนมากสำหรับปัญหาที่ง่ายมากเนื่องจากความต้องการของ regex
NotMe

40
ง่าย. string.split(',');
Braden ที่ดีที่สุด

4
ไม่แน่ใจว่าทำไมจึงถูกทำเครื่องหมายว่า "แปลเป็นภาษาท้องถิ่นเกินไป" แยกสตริงมาขึ้นจำนวนมากและเป็นโดยทั่วไปที่ใช้บังคับกับผู้ชมทั่วโลกของอินเทอร์เน็ต (เป็นหลักฐานจากความจริงที่ว่าคำตอบของฉันยังคงได้รับอย่างใดอย่างสม่ำเสมอ upvotes) ฉันสงสัยว่าคนอื่น ๆ อีก 4 คนจะเข้ามาเปิดใหม่ แต่ก็ยัง แปลก.
Matchu

คำตอบ:


1217
var array = string.split(',');

การอ้างอิง MDNส่วนใหญ่มีประโยชน์สำหรับพฤติกรรมที่ไม่คาดคิดของlimitพารามิเตอร์ (คำแนะนำ: "a,b,c".split(",", 2)ออกมา["a", "b"]ไม่ใช่["a", "b,c"])


3
สั้นและหวานมีความสุขที่จะเห็นว่า JavaScript มีบางความร่ำรวยของชวาstring String
Michael Shopsin

วิธีปฏิบัติที่ดีที่สุดสำหรับการสนับสนุนสตริงทุกประเภท ดูที่นี่stackoverflow.com/a/32657055/2632619
Andi AR

6
ในขณะที่splitจะทำงานได้ดีถ้าคุณแน่ใจว่าคุณมีองค์ประกอบในarrayถ้าคุณคาดหวังว่าข้อมูลจากเซิร์ฟเวอร์ / ฐานข้อมูลคุณจะพบปัญหาเนื่องจาก''.split(',')มีlength === 1IE:''.split(',') === ['']
oportocala

@MichaelShopsin และ All ฟังก์ชันแยกไม่ทำงานกับ IE11 เนื่องจากไม่สามารถรับคุณสมบัติ 'Split' ของการอ้างอิงที่ไม่ได้กำหนดหรือ null ได้
DLV

@DLV ที่ดูเหมือนคำถามใหม่บางทีคุณควรถามหลังจากตรวจสอบคำถาม IE ที่มีอยู่แล้วใน StackOverflow
Michael Shopsin

130

ระวังถ้าคุณตั้งเป้าที่จำนวนเต็มเช่น 1,2,3,4,5 หากคุณตั้งใจจะใช้องค์ประกอบของอาร์เรย์เป็นจำนวนเต็มและไม่ใช่สตริงหลังจากแยกสตริงแล้วให้พิจารณาแปลงเป็นสตริง

var str = "1,2,3,4,5,6";
var temp = new Array();
// this will return an array with strings "1", "2", etc.
temp = str.split(",");

เพิ่มวนแบบนี้

for (a in temp ) {
    temp[a] = parseInt(temp[a], 10); // Explicitly include base as per Álvaro's comment
}

จะส่งคืนอาร์เรย์ที่มีจำนวนเต็มไม่ใช่สตริง


47
โปรดทราบว่า parseInt () พยายามคาดเดาฐานเว้นแต่คุณจะตั้งค่าไว้อย่างชัดเจนซึ่งอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดเมื่อจัดการกับศูนย์นำหน้า ( "001,002,003...") เปรียบเทียบกับparseInt('010') parseInt('010', 10)
ÁlvaroGonzález

3
ฉันจะเพิ่มความคิดเห็นของ Alvaro มากกว่านี้ถ้าทำได้ ฉันเรียนรู้บทเรียนนั้นย้อนหลังไปและไม่เคยลืมเลย
Antony Scott

2
+1 ตัวอย่างนี้ชัดเจนยิ่งขึ้นแสดงให้เห็นว่าสตริงนั้นไม่ใช่วัตถุคงที่ แต่อันที่จริงแล้วตัวแปรที่เป็นสตริง
K0D4

5
mapฟังก์ชั่นที่สามารถใช้ในการทำแยกจำนวนเต็มในหนึ่งบรรทัด:str.split(',').map(parseInt)
ฟิลิปส์

1
นี่ไม่ใช่ทางออกที่มีประสิทธิภาพที่สุด จากการทดลองของฉันใน Chrome 49 JSON.parse ('[' + str + ']') เร็วกว่าโซลูชันนี้ 40%
เย้า

33

การแยกอืมเป็นอันตราย imho เป็นสตริงสามารถมีเครื่องหมายจุลภาคเสมอสังเกตต่อไปนี้

var myArr = "a,b,c,d,e,f,g,','";
result = myArr.split(',');

แล้วคุณจะขัดขวางสิ่งนั้นได้อย่างไร และคุณต้องการผลลัพธ์ที่จะเป็นอย่างไร อาร์เรย์ด้วย:

['a', 'b', 'c', 'd', 'e', 'f', 'g', '\'', '\''] or 
['a', 'b', 'c', 'd', 'e', 'f', 'g', ',']

แม้ว่าคุณจะหลบหนีจากเครื่องหมายจุลภาคคุณจะพบปัญหา

เล่นซอนี้อย่างรวดเร็วด้วยกัน:

(function($) {
    $.extend({
        splitAttrString: function(theStr) {
            var attrs = [];

            var RefString = function(s) {
                this.value = s;
            };
            RefString.prototype.toString = function() {
                return this.value;
            };
            RefString.prototype.charAt = String.prototype.charAt;
            var data = new RefString(theStr);

            var getBlock = function(endChr, restString) {
                var block = '';
                var currChr = '';
                while ((currChr != endChr) && (restString.value !== '')) {
                    if (/'|"/.test(currChr)) {
                        block = $.trim(block) + getBlock(currChr, restString);
                    }
                    else if (/\{/.test(currChr)) {
                        block = $.trim(block) + getBlock('}', restString);
                    }
                    else if (/\[/.test(currChr)) {
                        block = $.trim(block) + getBlock(']', restString);
                    }
                    else {
                        block += currChr;
                    }
                    currChr = restString.charAt(0);
                    restString.value = restString.value.slice(1);
                }
                return $.trim(block);
            };

            do {
                var attr = getBlock(',', data);
                attrs.push(attr);
            }
            while (data.value !== '');
            return attrs;
        }
    });
})(jQuery);

รู้สึกอิสระที่จะใช้ / แก้ไข :)


1
วิธีนี้ใช้งานได้ดีกับตัวเลขและเราไม่จำเป็นต้องวนซ้ำ parseInt แยกตามที่กล่าวไว้ในคำตอบอื่นด้านล่าง นี่คือความคิดที่ลึกซึ้งอย่างแท้จริง ขอบคุณมากและฉันคิดว่าคำตอบที่ดีที่สุดในบรรดา !!
Anmol Saraf

28

เมธอด split () ใช้เพื่อแยกสตริงเป็นอาร์เรย์ของสตริงย่อยและส่งคืนอาร์เรย์ใหม่

var array = string.split(',');

ผลลัพธ์จะเป็นอย่างไร เช่นถ้าฉันมี var a = "สวัสดีโลกที่รัก"; และ var array = a.split (','); -> อาเรย์ของฉันจะเป็นแบบนี้: array = ["hello", "world", "baby"]; ??
นักพัฒนาที่สำคัญ

1
ใช่ถูกต้องแล้ว อาเรย์ที่เกิดขึ้นจะเหมือนกับที่คุณพูดถึง
Jakkwylde

คำตอบของคุณใช้ได้สำหรับฉัน แต่อาร์เรย์ใหม่ของฉันไม่ได้แทนที่อันเก่า คุณสามารถช่วยฉันได้ไหม? var sampleTags = ['vinita@itsabacus.com']; console.log(sampleTags); $("#order_id").on("change", function() { var order_id = document.getElementById('order_id').value; $.ajax({url: "model/getUserMailIds.php",data:{order_id:order_id},type:'POST', success: function(result){ alert(result); var sampleTags = result.split(',');; console.log(sampleTags); }}); });
Vinita Pawar


14

ส่งสตริงที่คั่นด้วยเครื่องหมายจุลภาคของคุณไปยังฟังก์ชันนี้และมันจะส่งคืนอาร์เรย์และหากไม่พบสตริงที่คั่นด้วยเครื่องหมายจุลภาคดังนั้นจะส่งคืน null

 function splitTheString(CommaSepStr) {
       var ResultArray = null; 

// Check if the string is null or so.
        if (CommaSepStr!= null) {


             var SplitChars = ',';
   // Check if the string has comma of not will go to else
                if (CommaSepStr.indexOf(SplitChars) >= 0) {
                    ResultArray = CommaSepStr.split(SplitChars);

                }
             else { 
  // string has only one value, can also check the length of the string or time and cross-check too. 
                    ResultArray = [CommaSepStr]; 
              }
        }
       return ResultArray ;
    }

3
แทนที่จะโพสต์บล็อกรหัสเท่านั้นโปรดอธิบายว่าเพราะเหตุใดโค้ดนี้จึงแก้ปัญหาที่เกิดขึ้น หากไม่มีคำอธิบายนี่ไม่ใช่คำตอบ
Martijn Pieters

1
นี่เป็นวิธีที่ถูกต้องที่สุดหากคุณไม่แน่ใจว่าสตริงจะมีค่าการแยกของคุณ ฟังก์ชั่นนี้จะทำให้วิธีการแยกจากข้อผิดพลาดออกหากสตริงไม่มีเครื่องหมายจุลภาค (ตามตัวอย่างข้างต้น)
CoryDorning

1
หมายเหตุ: ฟังก์ชั่นที่เริ่มต้นด้วยอักษรตัวใหญ่เป็นส่วนใหญ่เวลาที่ออกแบบมาเพื่อเรียกใช้ ดีที่สุดที่จะใช้ตัวอักษรตัวพิมพ์เล็กในฟังก์ชั่นที่ไม่ได้ออกแบบมาให้เรียกใช้
Jsterman

สิ่งนี้ล้มเหลวสำหรับฉันเมื่อฉันมีค่าเดียวโดยไม่มีเครื่องหมายจุลภาค เพิ่มelse { ResultArray = [CommaSepStr]; }หลังจากวินาทีif
Thomas Byy

ขอขอบคุณได้เพิ่ม มัน.
BJ Patel

8

ฟังก์ชันส่งคืน

var array = (new Function("return [" + str+ "];")());

มันยอมรับสตริงและวัตถุ

var string = "0,1";

var objectstring = '{Name:"Tshirt", CatGroupName:"Clothes", Gender:"male-female"}, {Name:"Dress", CatGroupName:"Clothes", Gender:"female"}, {Name:"Belt", CatGroupName:"Leather", Gender:"child"}';

var stringArray = (new Function("return [" + string+ "];")());

var objectStringArray = (new Function("return [" + objectstring+ "];")());

JSFiddle https://jsfiddle.net/7ne9L4Lj/1/


3
สตริงข้อความกำลังมีข้อผิดพลาด - SyntaxError: สตริงหมายเลขตัวระบุที่ไม่คาดคิดก็โอเค เช่น. var stringtext = "String, text, I, am"; var stringtextArray = (new Function("return [" + string text + "];")()); ผลลัพธ์คือ: SyntaxError: ตัวระบุที่ไม่คาดคิด
nycdanie

7

ฉันรู้ว่าคำถามนี้ได้รับคำตอบมาระยะหนึ่งแล้ว แต่ฉันคิดว่าการมีส่วนร่วมของฉันจะเป็นประโยชน์ต่อผู้อื่นที่ค้นคว้าหัวข้อนี้ ...

นี่คือฟังก์ชั่นที่จะแปลงสตริงเป็นอาร์เรย์แม้ว่าจะมีเพียงรายการเดียวในรายการ (ไม่มีอักขระตัวคั่น):

function listToAray(fullString, separator) {
  var fullArray = [];

  if (fullString !== undefined) {
    if (fullString.indexOf(separator) == -1) {
      fullAray.push(fullString);
    } else {
      fullArray = fullString.split(separator);
    }
  }

  return fullArray;
}

ใช้แบบนี้:

var myString = 'alpha,bravo,charlie,delta';
var myArray = listToArray(myString, ',');
myArray[2]; // charlie

var yourString = 'echo';
var yourArray = listToArray(yourString, ',');
yourArray[0]; // echo

ฉันสร้างฟังก์ชันนี้เพราะsplitมีข้อผิดพลาดหากไม่มีตัวคั่นในสตริง (รายการเดียวเท่านั้น)


3
ไม่มีข้อผิดพลาดจะถูกโยนทิ้งถ้าแยกไม่พบ: 'echo'.split(',')ผลตอบแทน['echo']และ ผลตอบแทน''.split(',') ['']คุณจะได้รับข้อผิดพลาดถ้าคุณเรียกx.split(',')เมื่อxไม่ได้เป็นสตริง (รวมถึงเมื่อxมีการกำหนดหรือnull ) เพราะไม่มีsplitฟังก์ชั่นพร้อมใช้งานสำหรับประเภทอื่น ๆ
Joel Lee

อาฉันเห็นว่าจริง ๆ แล้วฉันพยายามใช้splitสำหรับวัตถุที่ไม่ได้กำหนดเมื่อฉันเขียนฟังก์ชัน listToArray ของฉัน ขอบคุณสำหรับการชี้ให้เห็นว่า ...
Kabb5

6

ฉันมีปัญหาที่คล้ายกัน แต่ซับซ้อนกว่าที่ฉันต้องการแปลง csv ให้เป็นอาร์เรย์ของอาร์เรย์ (แต่ละบรรทัดเป็นองค์ประกอบอาร์เรย์หนึ่งที่ภายในมีอาร์เรย์ของรายการที่แยกด้วยเครื่องหมายจุลภาค)

ทางออกที่ง่ายที่สุด (และปลอดภัยยิ่งกว่าที่ฉันเดิมพัน) คือการใช้ PapaParse ( http://papaparse.com/ ) ซึ่งมีตัวเลือก "no-header" ที่เปลี่ยน csv ให้เป็นอาร์เรย์ของอาร์เรย์และตรวจพบโดยอัตโนมัติ " "เป็นตัวคั่นของฉัน

นอกจากนี้ยังมีการลงทะเบียนใน bower ดังนั้นฉันต้อง:

bower install papa-parse --save

แล้วใช้ในรหัสของฉันดังนี้:

var arrayOfArrays = Papa.parse(csvStringWithEnters), {header:false}).data;

ฉันชอบมันจริงๆ.


5
let str = "January,February,March,April,May,June,July,August,September,October,November,December"

let arr = str.split(',');

มันจะส่งผล:

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

และถ้าคุณต้องการแปลงต่อไปนี้เป็น:

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

นี้:

"January,February,March,April,May,June,July,August,September,October,November,December";

ใช้:

str = arr.join(',')


1

สำหรับอาร์เรย์ของสตริงเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค

let months = ["January","Feb"];
let monthsString = months.join(", ");

1

คุณสามารถลองตัวอย่างต่อไปนี้

 var str = "How,are,you,doing,today?";
    var res = str.split(",");
    console.log("My Result:",res)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.