В настоящее время я работаю над чем-то, что требует от меня превратить строку в объект Javascript. Я пробовал так много разных вещей, искал ответы здесь, но ни один из них не соответствует моей проблеме.
Итак, вот что мне нужно сделать: мне нужно получить содержимое файла JS, которое выглядит примерно так: (я получаю содержимое с помощью простого HTTP-запроса)
initiateOptions({
fullscreen: true,
showController: true,
introModal: true,
client: {
name: 'Easyfairs - Flanders Expo',
city: 'Gent',
googlePlaceId: 'xxx'
},
preloadImages: {
client: 'easyfairs_flandersexpo'
},
languages: ['EN','FR','NL'],
logo: 'images/logo_wit.png',
css: ['https://fonts.googleapis.com/css?family=PT+Sans', '/css/event-
room-card.css', '/css/easyfairs.css'],
color: '#99cc33',
explainerImage: ['media/explainerImage.png'],
/*customTexts: {
switchYes: [{ "language":"NL", "text":"Beurs" },{ "language":"EN",
"text":"Exhibition" },{ "language":"FR", "text":"Exhibition" }],
switchNo: [{ "language":"NL", "text":"Leeg" },{ "language":"EN",
"text":"Empty" },{ "language":"FR", "text":"Vide" }]
},*/
});
Мне нужно использовать данные внутри этого файла, поэтому я хочу превратить его в объект JS, с которым я могу правильно работать. Я получаю содержимое файла в виде строки, поэтому я могу удалить функцию окружения с помощью манипуляций со строками и т. д.
Как видите, это JS-объект, обернутый в функцию, которая также содержит закомментированные строки. Мне очень сложно заставить его работать, я знаю, что есть способ заставить его работать с помощью eval(), но я бы предпочел не использовать его.
Кто-нибудь может мне помочь? Спасибо с уважением.
PS: Я не контролирую рабочий процесс, так устроен проект, поэтому мне нужно, чтобы он работал именно так.
Обычно я бы спросил, почему вы не хотите использовать eval(), но в этом случае это довольно ясно, и на самом деле многие (большинство/все?) альтернативы будут одинаково опасны.
вы получаете строковый объект из запроса GET?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У вас есть два варианта:
используйте синтаксический анализатор javascript, например Esprima, передайте ему свои js и пройдите AST, чтобы восстановить объект
используйте eval, в соответствии с
js = `initiateOptions({
fullscreen: true,
showController: true,
introModal: true,
// etc
})`
let initiateOptions = x => x;
let result = eval(js);
console.info(result)Не пытайтесь использовать строковые функции, регулярные выражения и т. д. для его анализа - вы просто потратите свое время.
Я не могу не подчеркнуть, насколько опасно использовать eval() для данных из URL-адреса.
@MikeBrockington: ну, наверное, потому что "кто-то может удалить все твои файлы"?
Значит, Эсприма будет моим единственным вариантом?
@GustDeprez: зависит ... это разовая задача или что-то, что вы будете делать на регулярной основе? Кроме того, это клиентская сторона или узел?
Бывает на стороне клиента, но я точно знаю, что люди с плохими намерениями не будут использовать то, что я создаю. Я просто хочу, чтобы был простой способ для этого работать
@GustDeprez: если это клиентская сторона, то этот код из вашего собственного домена, верно?
@GustDeprez: если вы контролируете код и можете быть уверены, что в нем нет ничего вредного (например, нет вызываемых функций и т. д.), то ничто не мешает вам использовать eval. Технически было бы намного лучше получить те же данные, что и JSON.
Я просто должен проголосовать, потому что это так умно :) Но также потому, что это единственный ответ здесь, который на самом деле работает. Остальные просто не работают и не можем работают с данными OP.
Это ужасное требование. У вас есть файл, который вы должны использовать без контроля над файлом, поэтому вам нужно каким-то образом получить файл в виде строки, а затем использовать манипуляции со строками, чтобы получить то, что вам нужно? Мое предложение, постарайтесь сильно сопротивляться этому требованию. Это безумие.