在javascript中合并两个对象而不会覆盖用户在游戏中的进度

时间:2017-03-29 14:47:06

标签: javascript jquery

背景:制作一些增量/空闲游戏,它有自动答题器和升级等,我将数据保存在localStorage中。在那一刻我已经将数据存储在一个对象中,我希望能够添加更多的答题器/升级,而无需重置用户进度。目前这是如何(希望不是太多的错误) - http://johnth.com/

我有一个定义为用户的对象,就像一个模板,所以当用户首次加载网站时,如果没有本地存储,它将保存用户,然后下次访问时将加载到变量中每秒称为x和甜瓜和瓜将填充数据。假如我添加了升级到瓜部分,那么如果我尝试加载它将是未定义的,所以我需要合并x(具有用户进度)和用户(具有新升级)。我不知道最好的解决方法我知道jQuery的.extendObject.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
      }
    }
  }
};

1 个答案:

答案 0 :(得分:1)

基本上,您需要递归版本的$.extendObject.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
}