gpt4 book ai didi

javascript - JSON 循环对象类型 Reviver

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:32:43 27 4
gpt4 key购买 nike

我正在构建一个网络应用游戏,它使用用户可以操作和保存的自定义圆形对象。所有对象都连接到使用 Circular-JSON 存储的循环“玩家”对象.

应用程序要求保留对象类型,但 JSON 不这样做。我无法为每个单独的对象声明类型,因为玩家可能有几百个不同类型的对象。我见过一些 reviver 是特定类型的,但不是通用的,也不是可以与圆形对象一起使用的。

例如:

function Room(name, description){
this.type = "room";
this.name = name;
this.description = description;
this.roomItems = [/*array of items randomly set*/];
this.exits = [/*array of rooms set */];
}

function Item(name, description, weight){
this.type = "item";
this.name = name;
this.description = description;
this.weight = weight;
this.components = [/*array of items*/];
this.contents = [];
this.setContents = function(item){
this.contents.push(item);
this.weight += item.weight;
}
}

function Player(startroom){
this.type = "player"
this.weightLimit = 20;
this.totalWeight = 0;
this.currentRoom = startroom; //this is a room
this.playerItems = [/* An array of Items */];
this.moveCount = 0;
}

应用通过以下方式保存和加载:

function saveGame(){    
var d = new Date()
player.lastsave = d.toISOString();
localStorage.setItem('player', CircularJSON.stringify(player));
}

function loadGame(){
declareStart(); //loads the same as a start
player = CircularJSON.parse(localStorage.getItem('player', reviver));
}

我试过的reviver如下:

function reviver(k, v){
switch (v.type) {
case "room":
$.extend(v, Room.prototype);
break;
case "item":
$.extend(v, Item.prototype);
break;
case "player":
$.extend(v, Player.prototype);
break;
}
return v;
}

加载将新播放器替换为本地存储中的播放器,但所有对象在此过程中都失去了它们的类型,然后失去了功能。

是否存在有效的复活剂?可以写一个吗?

我想一般的问题是,有没有办法在保持类型的同时存储和检索圆形对象?

最佳答案

@kahjav 您绝对可以通过使用 Object.create、对构造方法的名称进行内省(introspection)以及使用与构造函数的小写名称。请参阅我的要点: https://gist.github.com/jameswomack/6e6462f9c6ae5d9b9072

由于 CircularJSON 模块的创建方式,您不能单独使用 CircularJSON 保留父对象及其循环引用的类型。

基本上有两个步骤

function get(key, Proto) {
var result = JSON.parse(this.store[key]);
return key === Proto.name.toLowerCase() ? reviveFromJSONResult(result, Proto) : result;
}

function reviveFromJSONResult(result, Proto) {
var value = Object.create(Proto);
for (var key in result) {
value[key] = result[key];
}
value[Proto.name.toLowerCase()] && (value[Proto.name.toLowerCase()] = value);
return value;
}

var person = get('person', Person);

您传递 key 和构造函数名称(您甚至可以通过遵循约定进一步简化它),解析 key 处的对象,然后将其注入(inject)新的构造函数。此后,您只需分配给构造函数名称的小写版本。您还可以遍历这些值并找到“~”。

关于javascript - JSON 循环对象类型 Reviver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24149759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com