热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

字典帮助/数据存储

问题是我有一个字典,其中存放了我所有的数据,应该能够将其转换为复制存储

问题是我有一个字典,其中存放了我所有的数据,应该能够将其转换为复制存储中的目录,且所有值均为字符串,然后在播放器离开时又变为具有所有键的字典。但是,我不知道该如何变成字典(带键)。

我花了几个小时来测试东西,但是在第一层值之后,我无法弄清楚将更深的值和键放入表中的方法

local DataTable =
{
["DontSave_Values"] =
{
["Stamina"] = 100;
};
["DontSave_Debounces"] =
{
};
["TestData"] = 1;
["Ship"] =
{
["Hull"] = "Large_Ship";
["Mast"] = "iron_Tall";
["Crew"] =
{
["Joe One"] =
{
["Shirt"] = "Blue";
["Pants"] = "Green"
};
["Joe Two"] =
{
["Shirt"] = "Silver";
["Pants"] = "Brown";
["Kids"] =
{
["Joe Mama1"] =
{
["Age"] = 5
};
["Joe Mama2"]=
{
["Age"] = 6
};
}
};
}
};
["Level"] =
{
};
["Exp"] =
{
};
}
------Test to see if its an array
function isArray(Variable)
local Test = pcall(function()
local VarBreak = (Variable.." ")
end)
if Test == false then
return true
else
return false
end
end
------TURNS INTO FOLDERS
function CreateGameDirectory(Player,Data)
local mainFolder = Instance.new("Folder")
mainFolder.Parent = game.ReplicatedStorage
mainFolder.Name = Player.UserId
local function IterateDictionary(Array,mainFolder)
local CurrentDirectory = mainFolder
for i,v in pairs(Array) do
if isArray(v) then
CurrentDirectory = Instance.new("Folder",mainFolder)
CurrentDirectory.Name = i
for o,p in pairs(v) do
if isArray(p) then
local TemporaryDir = Instance.new("Folder",CurrentDirectory)
TemporaryDir.Name = o
IterateDictionary(p,TemporaryDir)
else
local NewValue = Instance.new("StringValue",CurrentDirectory)
NewValue.Name = o
NewValue.Value = p
end
end
else
local value = Instance.new("StringValue",mainFolder)
value.Name = i
value.Value = v
end
end
end
IterateDictionary(Data,mainFolder)
end
------To turn it back into a table
function Createtable(Player)
local NewDataTable = {}
local Data = RS:FindFirstChild(Player.UserId)
local function DigDeep(newData,pData,...)
local CurrentDir = newData
for i,v in pairs(pData:getchildren()) do
if string.sub(v.Name,1,8) ~= "DontSave" then
end
end
end
DigDeep(NewDataTable,Data)
return NewDataTable
end

我希望玩家离开时可以运行createtable函数,并将复制存储中的所有实例都转换为带键的字典。


为什么不将额外的信息存储在数据表中以帮助轻松地进行来回转换。例如,为什么不让您的数据如下所示:

local ExampleData = {
-- hold onto your special "DON'T SAVE" values as simple keys in the table.
DONTSAVE_Values = {
Stamina = 0,},-- but every element under ReplicatedStorage will be used to represent an actual Instance.
ReplicatedStorage = {
-- store an array of Child elements rather than another map.
-- This is because Roblox allows you to have multiple children with the same name.
Name = "ReplicatedStorage",Class = "ReplicatedStorage",Properties = {},Children = {
{
Name = "Level",Class = "NumberValue",Properties = {
Value = 0,Children = {},{
Name = "Ship",Class = "Model",Children = {
{
-- add all of the other instances following the same pattern :
-- Name,Class,Properties,Children
},-- end list of Children
},-- end ReplicatedStorage element
};

您可以使用简单的递归函数创建此表:

-- when given a Roblox instance,generate the dataTable for that element
local function getElementData(targetInstance)
local element = {
Name = targetInstance.Name,Class = targetInstance.ClassName,}
-- add special case logic to pull out specific properties for certain classes
local c = targetInstance.ClassName
if c == "StringValue" then
element.Properties = { Value = targetInstance.Value }
-- elseif c == "ADD MORE CASES HERE" then
else
warn(string.format("Not sure how to parse information for %s",c))
end
-- iterate over the children and populate their data
for i,childInstance in ipairs(targetInstance:GetChildren()) do
table.insert( element.Children,getElementData(childInstance))
end
-- give the data back to the caller
return element
end
-- populate the table
local Data = {
ReplicatedStorage = getElementData(game.ReplicatedStorage)
}

现在Data.ReplicatedStorage.Children应该具有整个文件夹的数据表示形式。如果愿意,您甚至可以将整个表保存为字符串,方法是将其传递给HttpService:JSONEncode()

当您准备将它们转换回实例时,请使用存储的数据为您提供有关如何重新创建元素的足够信息:

local function recreateElement(tableData,parent)
-- special case ReplicatedStorage
if tableData.Class == "ReplicatedStorage" then
-- skip right to the children
for i,child in ipairs(tableData.Children) do
recreateElement(child,parent)
end
-- quick escape from this node
return
end
-- otherwise,just create elements from their data
local element = Instance.new(tableData.Class)
element.Name = tableData.Name
-- set all the saved properties
for k,v in pairs(tableData.Properties) do
element[k] = v
end
-- recreate all of the children of this element
for i,child in ipairs(tableData.Children) do
recreateElement(child,element)
end
-- put the element into the workspace
element.Parent = parent
end
-- populate the ReplicatedStorage from the stored data
recreateElement( Data.ReplicatedStorage,game.ReplicatedStorage)

您应该谨慎选择如何以及何时选择保存此数据。如果您正在玩多人游戏,则应注意,这种逻辑只会为第一个加入服务器的玩家更新ReplicatedStorage。否则,您将冒着玩家加入并覆盖其他所有人所做的一切的风险。

由于无法迭代Roblox实例的属性,因此必须手动更新getElementData函数以正确存储每种对象类型所需的信息。希望这会有所帮助!

,

如果其他人遇到此问题,我所使用的解决方案只是将实例海峡转换为JSON格式(我使用名称作为键)。这样我就可以保存它,然后当播放器重新加入时,我只是使用JSONDecode将其转换为所需的字典。

function DirToJSON(Player)
local NewData = RS:FindFirstChild(Player.UserId)
local JSOnstring="{"
local function Recurse(Data)
for i,v in pairs(Data:GetChildren()) do
if v:IsA("Folder") then
if #v:GetChildren() <1 then
if i == #Data:GetChildren()then
JSOnstring=JSONstring..'"'..v.Name..'":[]'
else
JSOnstring=JSONstring..'"'..v.Name..'":[],'
end
else
JSOnstring=JSONstring..'"'..v.Name..'":{'
Recurse(v)
if i == #Data:GetChildren()then
JSOnstring=JSONstring..'}'
else
JSOnstring=JSONstring..'},'
end
end
else
if i == #Data:GetChildren()then
JSOnstring=JSONstring..'"'..v.Name..'":"'..v.Value..'"'
else
JSOnstring=JSONstring..'"'..v.Name..'":"'..v.Value..'",'
end
end
end
end
Recurse(NewData)
JSOnstring= JSONstring.."}"
return(JSONstring)
end

推荐阅读
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
泰有趣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有