背景:制作一些增量/空闲游戏,它有自动答题器和升级等,我将数据保存在localStorage中。在那一刻我已经将数据存储在一个对象中,我希望能够添加更多的答题器/升级,而无需重置用户进度。目前这是如何(希望不是太多的错误) - http://johnth.com/
我有一个定义为用户的对象,就像一个模板,所以当用户首次加载网站时,如果没有本地存储,它将保存用户,然后下次访问时将加载到变量中每秒称为x和甜瓜和瓜将填充数据。假如我添加了升级到瓜部分,那么如果我尝试加载它将是未定义的,所以我需要合并x(具有用户进度)和用户(具有新升级)。我不知道最好的解决方法我知道jQuery的.extend
和Object.assign
而且我无法弄清楚如何做到这一点。
var user = {
"name": "",
"stats": {
"click": 1,
"level": 1,
"xp": 0,
"melons": 0,
"mps": 0,
},
"upgrades": {
"melons": {
"mash": {
"name": "Mash - 1MPS",
"cost": 50,
"value": 1,
"owned": 0,
"scale": costScaling
},
"masher": {
"name": "Masher - 5MPS",
"cost": 500,
"value": 5,
"owned": 0,
"scale": costScaling
},
"mashing": {
"name": "Mashing - 25MPS",
"cost": 2500,
"value": 25,
"owned": 0,
"scale": costScaling
},
"mashmonster": {
"name": "MashMonster - 100MPS",
"cost": 250000,
"value": 100,
"owned": 0,
"scale": costScaling
}
},
"other": {
"click": {
"name": "Double Clicks",
"cost": 1000,
"value": 1,
"owned": 0,
"scale": costScaling
},
"a30secboost": {
"name": "30 Second Boost - 2.5x MPS",
"cost": 25000,
"value": 2.5,
"owned": 0,
"scale": costScaling
}
}
}
};
答案 0 :(得分:1)
基本上,您需要递归版本的$.extend
和Object.assign
递归合并两个对象的值。幸运的是,Lodash拥有你需要的功能。
查看lodash' merge。它允许您覆盖同一个键" path"中的值,或者如果它们不存在于第一个对象中则添加。
例如:
var foo = {
a: {
b: 1
},
c: 2
}
var bar = {
a: {
b: 2
},
d: 3
}
console.log(_.merge(foo, bar)) =>
{
a: {
b: 2 // overwritten by value in bar
},
c: 2,
d: 3 // added by bar
}