Мне нужна функция, создающая допустимую строку JSON из любого аргумента, но:
- избежать проблемы рекурсивности, не добавляя дважды объектов
- избежать проблемы с размером стека вызовов путем усечения прошлой заданной глубины
Как правило, он должен иметь возможность обрабатывать большие объекты за счет их усечения.
Как ссылка, этот код не работает:
var json = JSON.stringify(window);
Избежать проблемы рекурсивности достаточно просто:
var seen = [];
return JSON.stringify(o, function(_, value) {
if (typeof value === 'object' && value !== null) {
if (seen.indexOf(value) !== -1) return;
else seen.push(value);
}
return value;
});
Но на данный момент, кроме копирования и изменения кода Дугласа Крокфорда, чтобы отслеживать глубину, я не нашел способа избежать стека переполнение на очень глубоких объектах, таких как window
или любой event
. Есть ли простое решение?