Как преобразовать строку через запятую в массив?


720

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

Есть ли что-нибудь встроенное для этого?

Например, у меня есть эта строка

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

Теперь я хочу разделить это запятой, а затем сохранить его в массиве.


7
Просто хотел прокомментировать, что это не требует jquery, это часть самого javascript.
Крис


4
Относительно дубликата: это предшествует упомянутому вопросу на 18 месяцев. Во всяком случае, другой - не только обман, но и чрезвычайно сложное решение для очень простой задачи из-за требования регулярного выражения
NotMe

40
Легко. string.split(',');
Брэден Бест

4
Не уверен, почему это помечено как «слишком локализовано». Строка Расщепление выплывает много , и это вообще применимо к мировой аудитории интернета ( о чем свидетельствует тот факт , что мой ответ еще каким - то образом получает upvotes регулярно). Я сомневаюсь, что еще 4 человека придут и снова откроют его, но все же. Weird.
Матчу

Ответы:


1218
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, функция split не работает с IE11, так как она говорит: «Невозможно получить свойство« Split »с неопределенной или нулевой ссылкой.
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

Hmm split опасен 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); }}); });
Винита Павар

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
Вместо того, чтобы только публиковать блок кода, пожалуйста, объясните, почему этот код решает поставленную проблему. Без объяснения это не ответ.
Мартин Питерс

1
Это наиболее правильное решение, если вы не уверены, что строка будет содержать ваше значение разделения. Эта функция предотвращает ошибку метода split, если строка не имеет запятой (с учетом приведенного выше примера).
CoryDorning

1
Примечание: функции, которые начинаются с заглавной буквы, чаще всего предназначены для вызова. Лучше всего использовать строчные буквы для функций, которые не предназначены для вызова.
Jsterman

Это не удалось для меня, когда у меня было только одно значение без запятых. Добавлено else { ResultArray = [CommaSepStr]; }после второгоif
Томас Бай

Спасибо добавил. Это.
Би Джей Патель

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это не определено или нуль ), потому что нет splitфункции для других типов.
Джоэл Ли

Ах, я вижу, что на самом деле я пытался использовать splitнеопределенный объект, когда писал свою функцию listToArray. Спасибо за указание на это ...
Kabb5

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.