#javascript #split
#javascript #разделение
Вопрос:
У меня есть строка, которая содержит список элементов, некоторые из которых являются фиксированными, а некоторые из которых можно выбрать. В качестве примера предположим, что моя строка представляет собой список покупок:
"strawberry, raspberry, $2{tomato, sauerkraut, beans},
potato, $1{{apple, pear}, {orange, banana}}"
И я хотел бы в итоге получить что-то вроде:
["strawberry",
"raspberry",
[2, "tomato", "sauerkraut", "beans"],
"potato",
[1, ["apple", "pear"], ["orange", "banana"]]
Я понятия не имею, как я могу справиться с несколькими вариантами здесь, поэтому я открыт для любых предложений. Также вы можете изменить «синтаксис» (например, "$[num of coices]{list}"
) и добавить / удалить fluff, на самом деле это не имеет значения. Чем проще, тем веселее! :]
редактировать: у меня есть миллионы таких списков в приведенном выше формате, и преобразование их вручную не является вариантом, если только нет другого решения … : (
Спасибо!
Комментарии:
1. Было бы неплохо привести реальный пример и показать, для чего он используется и откуда берется строка
2. Это для автоматизации генерации персонажей для игры, где игроки могут выбирать (например), поступать ли им в военную школу или гражданскую академию. В зависимости от того, какой путь они выбрали (и некоторых других вещей), существует ряд возможных результатов, каждый из которых предусматривает фиксированное вознаграждение и набор типов «выбери X из». На данный момент эти вознаграждения в значительной степени хранятся в одной строке. Я надеюсь, что их можно как-то разделить, потому что их переработка — это большая проблема.
Ответ №1:
Почему вы не используете JSON для этого?
var list = ["strawberry",
"raspberry",
[2, "tomato", "sauerkraut", "beans"],
"potato",
[1, ["apple", "pear"], ["orange", "banana"]]];
var str = JSON.stringify(list);
/*
str = '["strawberry","raspberry",[2,"tomato","sauerkraut","beans"],"potato",[1,["apple","pear"],["orange","banana"]]]'
*/
var list2 = JSON.parse(str);
/*
list2 = ["strawberry",
"raspberry",
[2,"tomato","sauerkraut","beans"],
"potato",
[1, ["apple","pear"], ["orange","banana"]]]
*/
Комментарии:
1. Также возможно с помощью jQuery $.parseJSON — тестовый пример
2. Спасибо, но я забыл упомянуть, что у меня буквально тысячи таких списков, и я хотел бы избежать их преобразования вручную.
3. @Kenny: в вашем вопросе сказано «Также вы можете изменить «синтаксис»», а JSON — это стандартный формат сериализованных объектов JavaScript.
4. @Kenny: откуда вообще взялись эти «тысячи списков»?
5. Мой друг начал создавать эту штуковину и потратил целую вечность на ее ввод. Именно в таком формате. Я взял управление на себя, подумав: «О, для этого нужно всего несколько сотен строк скрипта».. Да, конечно. :]]]
Ответ №2:
Во-первых: я настоятельно рекомендую использовать решение на основе JSON, о котором упоминал Мэтт. Но по какой-то причине вы не можете адаптировать свой текущий код для этого, тогда попробуйте это: Примечание: я не тестировал его для разных тестовых случаев, но я думаю, что это даст вам идею…
var testString = "strawberry, raspberry, $2{tomato, sauerkraut, beans}, potato, $1{{apple, pear}, {orange, banana}}";
testString = testString.replace(/$(d ){/g, "{$1,");
testString = testString.replace(/{/g, "[").replace(/}/g, "]");
testString = testString.replace(/b/g,'"')
testString = testString.replace(/(")([)/g,'$2$1')
testString = testString.replace(/(])(")/g,'$2$1')
testString = '[' testString ']';
var obj = JSON.parse(testString);
for(var o in obj)
{
alert(typeof obj[o]);
}
Рабочий пример: http://jsfiddle.net/PcMhw/4 /
Комментарии:
1. Спасибо! Это именно то, что мне было нужно, работает как шарм! Вы, уважаемый сэр (или леди), просто изумительны.
2. На мой взгляд, выглядит неплохо. Я бы взял этот код и использовал его для преобразования данных в JSON как можно скорее .
3. @Kenny: Но имейте в виду, что данные в строке могут легко нарушить приведенный выше код. Как пробел в strwawberry (клубничная ягода). Конечно, вы можете улучшить код, чтобы он мог обрабатывать эти сценарии, но это становится более сложным по мере определения большего количества тестовых случаев. Вот почему даже я склоняюсь к решению на основе JSON. Просто хочу убедиться, что вы понимаете риск.
4. Поскольку это только для хобби, я на самом деле не беспокоюсь о том, что что-то сломаю. :] Вероятно, я сделаю то, что предлагает Мэтт, и использую это в первую очередь для преобразования всего материала в JSON. Еще раз спасибо!