我试图通过localStorage保存一个由多个JS对象组成的数组。
我想我遇到与Fail when pushing an array of js objects to localStorage and then retrieving it and parsing相同的麻烦,但是没有解决方法。
var featureArray=[];
map.on('click', function(evt) {
if (feature) {
featureArray.push(feature.values_);
}
});
function saveFeatures() {
localStorage.setItem('features', featureArray);
}
saveFeatures();
当我尝试通过localStorage.getItem('features')
加载它们时,输出类似于:
[object Object],[object Object]
但实际上我希望保存这个结构背后的值。
我尝试localStorage.setItem('features', JSON.stringify(featureArray))
,但是会抛出错误
TypeError:将循环结构转换为JSON
我做错了什么?
console.log(featureArray)的输出:
(2) [{…}, {…}]
0:
geometry:ol.geom.MultiPolygon {pendingRemovals_: {…}, dispatching_: {…}, listeners_: {…}, revision_: 2, ol_uid: 39, …}
krs:"Niedersachsen"
sumarea_1_2014:20298
sumarea_1_2015:16045
sumarea_1_2016:19008
sumarea_3_2014:3888
sumarea_3_2015:27971
sumarea_3_2016:15520
sumarea_5_2014:11888
sumarea_5_2015:14671
sumarea_5_2016:31307
__proto__:Object
1:
geometry:ol.geom.MultiPolygon {pendingRemovals_: {…}, dispatching_: {…}, listeners_: {…}, revision_: 2, ol_uid: 41, …}
krs:"Nordrhein-Westfalen"
sumarea_1_2014:23100
sumarea_1_2015:2399
sumarea_1_2016:21916
sumarea_3_2014:11375
sumarea_3_2015:31563
sumarea_3_2016:20300
sumarea_5_2014:859
sumarea_5_2015:20633
sumarea_5_2016:31101
__proto__:Object
length:2
__proto__:Array(0)
更新:https://jsfiddle.net/ytc26fju/3/ 。将鼠标悬停在圆点上以更新阵列。然后单击“保存”,然后单击“加载”按钮。
答案 0 :(得分:3)
你需要将它转换为JSON来存储它(使用JSON.stringify)并在解决方案时解析它,因为localStorage存储字符串而不是对象。
错误TypeError: Converting circular structure to JSON
表示您的数据结构具有固有循环,其中有一个对象a
,其对象b
作为属性,然后将对象a
作为财产...广告无限。显然你不能“写出来”,因为它是一个无限循环。浏览你想要保存的对象,你可能会看到它出错的地方 - 你似乎非常乐意将内容推送到featureArray
。
答案 1 :(得分:2)
将项目设置为本地存储。
localStorage.setItem('features', JSON.stringify(featureArray));
从本地存储中获取该项目。
var data = JSON.parse(localStorage.getItem('features'));
答案 2 :(得分:0)
JSON.stringify
接受replacer参数,该参数可帮助您在对对象进行字符串化时删除循环对象。
这是一个非常简单的实现,它将循环对象的第二次出现转换为null
:
function cyclicsCleaner() {
var seenObjects = [];
return function cleanCyclics(key, obj) {
if (obj && typeof obj === 'object') {
if (seenObjects.indexOf(obj) !== -1) {
return null;
}
seenObjects.push(obj);
}
return obj;
}
}
// generate a cyclic object
var a = {};
var b = {
cyclic: a
};
a.b = b;
console.log(JSON.stringify(a, cyclicsCleaner()));
答案 3 :(得分:0)
知道了。不完全理解为什么,但一个功能对象帽子是一个圆形结构。我不得不这样做:
for (i=0;i<featureArray.length;i++) {
delete featureArray[i].geometry;
}