Кажется, что люди, приземляющиеся здесь, имеют дело со структурами, которые были бы действительными JSON, если бы не тот факт, что они содержат функции.Итак, как нам справиться с приведением в порядок этих структур?
Я столкнулся с проблемой при написании скрипта для изменения конфигурации RequireJS.Вот как я это сделал.Во-первых, есть немного кода ранее, который гарантирует, что заполнитель, используемый внутри (">>>F<<<"
), не отображается как значение в конфигурации RequireJS.Очень маловероятно, но лучше, чем потом сожалеть.Входная конфигурация читается как объект JavaScript, который может содержать массивы, атомарные значения, другие Object
s и функции.Это было бы просто stringifiable как JSON, если бы функции не присутствовали.Эта конфигурация является объектом config
в следующем коде:
// Holds functions we encounter.
var functions = [];
var placeholder = ">>>F<<<";
// This handler just records a function object in `functions` and returns the
// placeholder as the value to insert into the JSON structure.
function handler(key, value) {
if (value instanceof Function) {
functions.push(value);
return placeholder;
}
return value;
}
// We stringify, using our custom handler.
var pre = JSON.stringify(config, handler, 4);
// Then we replace the placeholders in order they were encountered, with
// the functions we've recorded.
var post = pre.replace(new RegExp('"' + placeholder + '"', 'g'),
functions.shift.bind(functions));
Переменная post
содержит окончательное значение.Этот код основан на том факте, что порядок, в котором вызывается handler
, совпадает с порядком различных частей данных в окончательном JSON.Я проверил 5-е издание ECMAScript, которое определяет алгоритм строкового преобразования и не может найти случай, когда возникнет проблема с упорядочением.Если этот алгоритм изменится в будущем издании, исправление будет состоять в том, чтобы использовать уникальные плашдолеры для функций и использовать их для обращения к функциям, которые будут храниться в ассоциативном массиве, отображающем уникальные заполнители в функции.