Как преобразовать строку в массив - PullRequest
5 голосов
/ 03 апреля 2012

У меня есть строка str = "[123, 345, 567]".Я хочу преобразовать это в массив arr = [123, 345, 567].Как это сделать?

Ответы [ 4 ]

22 голосов
/ 03 апреля 2012

Если вы знаете , что строка содержит массив, вы можете просто использовать eval;

arr = eval(str)

Если вы не уверены, вы можете перейти кнемного больше: удаление скобок, разбиение на , и сбор чисел в массив;

arr = str[1..-2].split(',').collect! {|n| n.to_i}

Демонстрация обоих здесь .

4 голосов
/ 03 апреля 2012
str = "[123, 345, 567]"

1) eval(str)

2) str = "[123, 345, 567]".scan( /\d+/ ) # Make the array
str.map!{ |s| s.to_i } # convert into integer
2 голосов
/ 03 апреля 2012

Самое простое - что-то вроде arr = eval(str), но это не очень безопасно.Другой вариант - сделать что-то вроде arr = str.gsub(/\[|\]/,'').split(/,/).map(&:to_i) - убрать скобки из исходной строки, разделить запятыми, а затем преобразовать полученные фрагменты строки в целые числа.

1 голос
/ 24 марта 2015

Для проектов Rails я обнаружил, что встроенный JS-декодер ActiveSupport является хорошим решением. Просто оберните строку в JSON, расшифруйте ее и верните новый массив:

def to_a(str)   
    wrapped_str = "{ \"wrapper\": #{str} }"

    ActiveSupport::JSON.decode(wrapped_str)['wrapper'] rescue str
end

str = '[1, 2, [3, [4, 5, true, "a", {"test": "whee"}]]]'
str_to_a = to_a(str)

Это вернет массив, если строка является допустимым JSON. Если декодирование завершится неудачно, будет возвращена исходная строка. Обратите внимание, что действительный JSON в этом случае относится только к содержимому массива - если массив строк содержит какие-либо хэши (здесь следует предостережение), все хеш-ключи должны быть заключены в double цитаты. Также обратите внимание, что логические значения будут преобразованы в логические значения только в том случае, если они не заключены в кавычки.

Возвращение исходной строки при неудачном декодировании позволяет преобразовывать строки только там, где это успешно (другие строки остаются без изменений). В качестве альтернативы, вы можете принудительно преобразовать все в массив (или пустой массив), используя rescue [].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...