我使用 http://arshaw.com/fullcalendar/的全日历jquery插件我在我的网站上使用淘汰 js。
我添加了事件数组,这是日历的来源。用户可以修改事件(数组)。
然后我想序列化事件数组,由 ajax 发送,但我不能,因为日历修改了我的数组,并在源数组中放置了一个循环。如何删除更改。为什么我的数组中有一个循环?我读过,可能这里面有一个DOM对象。
Chrome 发送请求错误:类型错误:将循环结构转换为 JSON
var a = [];
a.push({
title: "Event2",
start: "2013-09-05"
});
a.push({
title: "Event2",
start: "2013-09-15"
});
$("#calendar").fullCalendar({
events: a,
header: {
left: "title",
center: "",
right: "today prev,next"
},
editable: false
});
console.log(JSON.stringify(a));
类型错误:将循环结构转换为 JSON
我该如何解决它?周期的原因是什么?
小提琴示例,您可以看到我的问题:
http://jsfiddle.net/erbsaag/XC3NH/1
插件正在修改您的数据。
如果您运行
console.log(a)
在主机之前.log您可以看到问题。一种解决方案是只返回您需要的字段,而不返回具有循环递归的字段。
例:
console.log(JSON.stringify(a.map(function(ai) { return {title: ai.title, start: ai.start}})));
请参考这个问题:JSON.stringify,避免类型错误:将循环结构转换为JSON
这是一个函数,将该答案改编为简单的可重用单行:
const jsonStringifySafe = (o) => {
// Almost as seen in stackoverflow.com/questions/11616630
var cache = [];
let retv = JSON.stringify(o, (key, value) => {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// Circular reference found, discard key
return;
}
// Store value in our collection
cache.push(value);
}
return value;
});
cache = null;
return retv;
}
用法:
console.log(jsonStringifySafe(a));
例:http://jsfiddle.net/felyper/XC3NH/17/