9

Как преобразовать строку, разделённую запятыми, в массив?

40

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

Например, у меня есть следующая строка:

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

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

5 ответ(ов)

1

Будьте внимательны, если вы планируете использовать целые числа, такие как 1, 2, 3, 4, 5. Если вы собираетесь использовать элементы вашего массива как целые числа, а не как строки после разбиения строки, рассмотрите возможность их преобразования.

var str = "1,2,3,4,5,6";
var temp = new Array();
// Это вернет массив со строками "1", "2" и т.д.
temp = str.split(",");

Добавив такой цикл:

for (a in temp) {
    temp[a] = parseInt(temp[a], 10); // Явно указываем основание, как отметил Альваро
}

вы получите массив, содержащий целые числа, а не строки.

0

Вопрос, который вы подняли, действительно очень актуален, так как использование метода split может быть рискованным, особенно когда строка содержит символ-разделитель, например, запятую. В вашем примере:

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

В этом случае, результатом будет массив:

['a', 'b', 'c', 'd', 'e', 'f', 'g', "'"]

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

Как вы хотите интерпретировать вашу строку и какой результат вас устроит? Вы хотели бы получить что-то вроде:

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

или

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

Даже если вы попытаетесь экранировать запятую, это лишь усугубит проблему.

Чтобы обойти эту проблему, вы можете использовать функцию, которая будет учитывать различные шаблоны, например, те, которые будут игнорировать запятые, заключенные в кавычки или скобки. В вашем коде, вы уже начали разрабатывать такую логику, как, например, функция splitAttrString, которая будет правильно обрабатывать строки, учитывая различные конструкции.

Функция getBlock в представленном вами коде осуществляет рекурсивный обход строки, собирая элементы, разбитые по заданному символу, но при этом игнорирует запятые внутри кавычек и других блоков. Важно, чтобы такие условия были в полной мере учтены, чтобы избежать неправильной обработки строк.

Таким образом, предложенное вами решение — это подходящий способ решения задачи, но его стоит протестировать на широком диапазоне примеров, чтобы убедиться, что оно будет стабильно работать.

0

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

Пример использования:

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

В приведённом коде строка разделяется по запятой, и результатом будет массив, состоящий из подстрок, которые были разделены по этому разделителю.

0

Улучшенный str.split(',')

Простая функция str.split(',') не обладает большой "умностью". Ниже приведены некоторые улучшения для различных нужд. Вы можете настроить функциональность так, как вам нравится.

const str = "a, b,c,  d  ,e  ,f,,g"
const num = "1, 2,3,  4  ,5  ,6,,7.495"
const mix = "a, 2,3,  d  ,5  ,f,,7.495,g"

console.log(    str.split(',')
) // пробелы НЕ обрезаны, пустые значения включены
  // ["a", " b", "c", "  d  ", "e  ", "f", "", "g"] 

console.log(    str.split(/\s*,\s*/)
) // пробелы обрезаны, пустые значения включены
  // ["a", "b", "c", "d", "e", "f", "", "g"]

console.log(    str.split(/\s*,\s*(?:,\s*)*/)
) // пробелы обрезаны, пустые значения пропущены
  // ["a", "b", "c", "d", "e", "f", "g"] 

console.log(    num.split(',').map(Number)
) // числа, пустые значения по умолчанию равны нулю
  // [1, 2, 3, 4, 5, 6, 0, 7.495] 

console.log(    num.split(/,(?:\s*,)*/).map(Number)
) // числа, пустые значения пропущены
  // [1, 2, 3, 4, 5, 6, 7.495]

console.log(    mix.split(/\s*,\s*/)
                .map(x => (x === '') ? '' : (isNaN(Number(x)) ? x : Number(x)) )
) // смешанные значения, пустые значения включены
  // ["a", 2, 3, "d", 5, "f", "", 7.495, "g"]

Использование JSON.parse

Это может показаться немного "хаком", но поскольку большинство движков JavaScript оптимизируют его, он работает очень быстро.

У него есть некоторые другие преимущества, такие как поддержка вложенных списков. Однако есть и недостатки, например, необходимость в корректном формате JSON для входных данных.

Используя string.replace, аналогично тому, как я использовал string.split выше, вы можете исправить входные данные. В первых двух примерах ниже я настраиваю, как хочу обрабатывать пустые значения:

const num = "1, 2,3,  4  ,5  ,6,,7.495"
const mix = "a, 2,3,  d  ,5  ,f,7.495,g"

console.log(    JSON.parse('['+num.replace(/,\s*,/,',0,')+']')
) // числа, пустые значения по умолчанию равны нулю
  // [1, 2, 3, 4, 5, 6, 0, 7.495]

console.log(    JSON.parse('['+num.replace(/,\s*,/,',')+']')
) // числа, пустые значения пропущены
  // [1, 2, 3, 4, 5, 6, 7.495]

console.log(    JSON.parse('['+mix.replace(/(^|,)\s*([^,]*[^0-9, ][^,]*?)\s*(?=,|$)/g,'$1"$2"')+']') 
) // смешанные значения, приведет к ошибке при наличии пустых значений
  // ["a", 2, 3, "d", 5, "f", "7.495", "g"]  
0

В данном коде происходит следующее:

  1. Создается переменная a и инициализируется пустой строкой ("").
  2. Затем создается массив x, но в данном случае это не имеет большого значения, так как он будет переопределен в следующей строке.
  3. Вызывается метод split на строке a с разделителем ",".

Метод split делит строку на подстроки по указанному разделителю. Поскольку строка a пустая, она не содержит разделителей, и результат выполнения a.split(",") будет массив, содержащий один элемент — саму пустую строку.

Таким образом, при выполнении alert(x.length) будет выведено 1, так как массив x состоит из одного элемента: [""] (пустая строка).

Если бы строка a содержала, например, значения, разделенные запятыми, то в результате split длина массива была бы равна количеству этих значений плюс один, если в конце строки располагалась запятая.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь