Як перетворити розділений комою рядок у масив?


720

У мене є відокремлений комою рядок, який я хочу перетворити в масив, щоб я міг пройти через нього.

Чи є щось вбудоване для цього?

Наприклад, наприклад, у мене є цей рядок

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

тепер я хочу розділити це комою, а потім зберегти в масиві.


7
Просто хотів прокоментувати, що для цього не потрібен jquery, це частина самого JavaScript.
Кріс


4
Що стосується дубліката: це передує посиланому питанню до 18 місяців. Якщо що, інше - це не лише дура, але пропонує надзвичайно складне рішення дуже простої проблеми через вимогу регулярного
виразки

40
Легко. string.split(',');
Braden Best

4
Не впевнений, чому це позначено як "занадто локалізований". Розбиття рядків виникає багато , і, як правило, застосовно до всесвітньої аудиторії Інтернету (про що свідчить той факт, що моя відповідь все ще якимось чином регулярно оновлюється). Я сумніваюся, четверо інших людей прийдуть і знову відкриють його, але, все ж. Дивно.
Мачу

Відповіді:


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

Посилання MDN , в основному, корисне для можливо несподіваної поведінки limitпараметра. (Підказка: "a,b,c".split(",", 2)виходить ["a", "b"], ні ["a", "b,c"].)


3
Короткий і милий, приємно бачити, що JavaScript stringмає певне багатство Java String.
Майкл Шопсін

Найкраща практика для підтримки всіх типів струн. Дивіться тут stackoverflow.com/a/32657055/2632619
Andi AR

6
Хоча splitбуде добре працювати, якщо ви впевнені, що у вас є елементи array, якщо ви очікуєте, що дані з сервера / бази даних, у вас ''.split(',')length === 1''.split(',') === ['']
виникнуть

@MichaelShopsin та All, спліт-функція не працює з IE11, оскільки її приказка Неможливо отримати властивість "Розділити" невизначеного або нульового посилання.
DLV

@DLV, це звучить як нове запитання, можливо, ви можете його задати, перевіривши питання IE, які вже є на StackOverflow.
Майкл Шопсін

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).
Альваро Гонсалес

3
Я б більше підтримав коментар Альваро, якби міг. Я повчився на тому уроці, і ніколи його не забував.
Антоні Скотт

2
+1 Цей приклад є більш зрозумілим, демонструючи, що рядок не є статичним об'єктом, а насправді є змінною, яка є рядком.
K0D4

5
mapФункція може бути використана для виконання цілочисельного синтаксичного аналізу в одному рядку:str.split(',').map(parseInt)
Jud

1
Це не найефективніше рішення. Згідно з моїми експериментами під Chrome 49. JSON.parse ('[' + str + ']') на 40% швидше, ніж це рішення.
Яо

33

Хм розділення небезпечно, оскільки рядок завжди може містити кому, дотримуйтесь наступного:

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
Це чудово працює і з числами, і нам не потрібно запускати окремий цикл аналізу, як зазначено в іншій відповіді нижче. Це справжнє глибоке мислення. Вдячний за це, і я думаю, що найкраща відповідь серед усіх !!
Anmol Saraf

28

Метод split () використовується для розділення рядка на масив підрядів та повертає новий масив.

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

Яким був би результат? наприклад, якщо у мене var a = "привіт, світ, дитино"; і var array = a.split (','); -> чи виглядав би мій масив так: array = ["привіт", "світ", "дитина"]; ??
головний розробник

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); }}); });
Вініта Павар

16

Зауважте, що наступне:

 var a = "";
var x = new Array();
x = a.split(",");
alert(x.length);

попередить 1


14

Передайте в цю функцію відокремлену комою рядок і вона поверне масив, а якщо не знайдено відокремлений комою рядок, то поверне нуль.

 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
Томас Бай

Спасибі додали. це.
BJ Patel

8

Функція повернення

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

його прийняти рядок і stringstrings

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це не визначене або нуль ), тому що немає splitфункції для інших типів.
Джоель Лі

Ах, я бачу, що насправді я намагався використовувати splitдля невизначеного об'єкта, коли писав свою функцію listToArray. Дякуємо, що
вказали

6

У мене була подібна проблема, але більш складна, як мені потрібно було перетворити csv в масив масивів (кожен рядок - це один елемент масиву, який всередині має масив елементів, розділених комою).

Найпростішим рішенням (і більш безпечним, на який я ставлю ставку) було використання PapaParse ( http://papaparse.com/ ), який має опцію "без заголовка", яка перетворює csv в масив масивів, плюс він автоматично виявляє " , "як мій роздільник.

Плюс, він зареєстрований у балончику, тому мені довелося лише:

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

3

хороше рішення для цього

let obj = ['A','B','C']

obj.map((c) => { return c. }).join(', ')


1

ви можете спробувати наступний фрагмент

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.