Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   преобразовать строку с массивом в массив (https://javascript.ru/forum/misc/51222-preobrazovat-stroku-s-massivom-v-massiv.html)

eniacty 29.10.2014 07:20

преобразовать строку с массивом в массив
 
Подскажите пожалуйста как преобразовать строку, которая была многомерным массивом, например:
str = "['фильмы', ['Смерч', ['актеры', [Стив Анжело', 'Роберто Родригес']]],['Ураган',['актеры',['Макс Никитин', 'Алексей Ходин']]]]"

в корректный массив, например чтобы при запросе [1][0][1] элемента был Алексей Ходин.

Есть ли для этого готовые реализации функций?

Вообще строка, которую нужно разобрать имеет достаточно глубокий массив со множеством элементов, поэтому просто str.split() то это не очень приятно.

danik.js 29.10.2014 07:28

Это называется JSON. И для его разбора есть встренные функции:

var str = '["фильмы", ["Смерч", ["актеры", ["Стив Анжело", "Роберто Родригес"]]],["Ураган",["актеры",["Макс Никитин", "Алексей Ходин"]]]]';
alert(
    JSON.parse(str)[2][1][1][1]
);


Только кавычки там должны быть двойные.

Для обратной операции есть JSON.stringify()

eniacty 29.10.2014 07:43

в массиве, могут быть пустые элементы, например [a [,,false,],,]

eniacty 29.10.2014 08:41

или [,],[,[,],]

danik.js 29.10.2014 08:56

Значит это не валидный JSON. А откуда берется такая глупая строка?
Если источник сторонний, то тебе остается только eval'ить строку. А если сам наговнокодил - то исправляй.

Aetae 29.10.2014 08:56

eniacty, что у вас этот массив формирует? Используйте стандартную функцию для преобразования к json, она во многих языках присутствует, а если и нет - обязательно есть сторонняя.

Если же вам зачем-то надо вместо json городить свой уродливый формат - то придётся писать вручную такой же уродливый парсер.

danik.js 29.10.2014 08:58

Цитата:

Сообщение от Aetae
придётся писать вручную такой же уродливый парсер.

Ну почему же уродливый. Парсер js-исходников - вполне нормальная штука. Вот только использовать ее здесь - совсем не нормально)

eniacty 29.10.2014 09:30

эта строка приходит из API.

Получается, что я могу сделать так:

strArr = eval(str);
а потом разбирать strArr как обычный массив.

Но мне бы не хотелось :)

Есть ли другие варианты?

ksa 29.10.2014 10:24

Цитата:

Сообщение от eniacty
Но мне бы не хотелось

Есть ли другие варианты?

Тогда приводи строку в нормальный вид и далее как учили выше...

eniacty 29.10.2014 10:33

я и так хочу строку привести в нормальный вид - в вид массива :)
У меня нет доступа к тому, что ее формирует, я лишь отправляю get запрос и получаю в ответе эту строку.

еще есть вариант использовать парсер js-кода, но в результате получается очень неудобный объект.

ksa 29.10.2014 10:35

Цитата:

Сообщение от eniacty
я лишь отправляю get запрос и получаю в ответе эту строку

Получив строку - меняй ее до нормального json-формата. Потом используй обычный json-парсер...

danik.js 29.10.2014 10:38

Наверняка есть либа для парсинга твоего недо-json.
Еще, наверняка есть способ безопасно заeval'ить эту строку.

Aetae 29.10.2014 12:03

danik.js, да ну. Эвалить чужую строку - не секурно, всегда есть шанс наколоться.)

danik.js 29.10.2014 16:58

Aetae, нельзя никак? Значит спутал с чем-то. Помню где-то добавляют throw в начало строки зачем-то. Кажется как раз в JSON, чтобы его не eval'или.

.. В голове моей кашка-малашка ))


Часовой пояс GMT +3, время: 16:14.