【问题标题】:Javascript object literal template: Extending implementation object with a baselineJavascript 对象文字模板:使用基线扩展实现对象
【发布时间】:2016-07-14 13:22:15
【问题描述】:

我正在使用 javascript 对象文字,并获得了一个绝妙的想法,即通过抽象所有常见属性来简化我必须使用的实际对象文字。

因此,我想从基线预定义对象结构扩展/继承/合并我的具体对象。 我的意思是这样的:

基线:

{  
       "id":"",
       "options":[  
          {  
             "1":true,
              "concreteValue":"important"
          },
          {  
             "2":false,
              "concreteValue":"unimportant"
          },
          {  
             "3":true,
             "concreteValue":"important"
          }
       ],
       "greeting":"Howdy",
       "player":{  
          "name":"",
          "hp":1,
          "mana":10
       }
}

混凝土:

{  
   "id":"player1",
   "options":[  
      {  
         "5":true,
          "concreteValue":"awesome"
      }
   ],
   "greeting":"Greetings!",
   "player":{  
      "name":"player1",
      "hp":15
   }
}

通过扩展/继承/合并concretebaseline,我希望输出是这样的:

{  
   "id":"player1",
   "options":[  
      {  
         "1":true,
         "concreteValue":"important"
      },
      {  
         "2":false,
         "concreteValue":"unimportant"
      },
      {  
         "3":true,
         "concreteValue":"important"
      },
      {  
         "5":true,
         "concreteValue":"awesome"
      }
   ],
   "greeting":"Greetings!",
   "player":{  
      "name":"player1",
      "hp":15,
      "mana":10
   }
}

因此,两个地方都存在的值会被具体的值覆盖,不存在的值会被添加。 这似乎是一种很好的做事方式,所以我确信有一种聪明的方式来做这件事,我还没有找到:) 我查看了jQuery Extend,但它似乎没有将同名的值相互合并。

我尝试使用concatObject.Assign,但它们也没有成功。 有人有什么想法吗?

【问题讨论】:

  • JavaScript 中没有针对您想要的行为的内置解决方案。要实现最终的合并对象,您需要迭代 concrete 中的键。
  • 顺便说一句,这和JSON完全没有关系,它只不过是一种序列化格式。你在谈论 JavaScript 对象字面量。

标签: javascript jquery software-design


【解决方案1】:

Lodash 库可以在这里使用。

如果这是您唯一使用 Lodash 的目的,我可能会选择 @DelightedD0D 解决方案而不添加其他库。

使用 Lodash 的优点是 customizer 函数,您可以在其中指定一些自定义合并好东西,尽管我不知道这是否可能在 jQuery @ 987654326@接近。

您可以使用merge(src, dest, customizer) 函数获取您描述的内容,结果如下:
http://jsbin.com/qibeji/edit?js,console

LodashUnderscore 是高级 javascript 对象操作的最佳库。

看看这两个问题,详细了解您可以做什么:
Lodash - difference between .extend() / .assign() and .merge()
Lodash: Constructing single object from many - Merging/overriding properties

【讨论】:

  • 这不会正确合并对象,请参阅prnt.sc/akieg3。看看 1 和 5 的值如何在同一个对象中?并且选项对象中只有 3 个对象,现在应该有 4 个。这本身相当于 jQuery.extend() 我不认为您可以在不更改 JSON 结构的情况下使用任何库自动执行此操作。
  • 不错,需要修改
  • 在 options 对象中使用数组会导致每个对象的键 0 被合并,它们需要有命名键来防止这种情况发生
  • @DelightedD0D 更新了答案,更改了 jsbin 链接
  • 现在它可以工作了......这种方法的唯一优点是customizer 函数。
【解决方案2】:

为此,您可以更改options 对象的结构,如下所示,然后jQuery.extend(true, baseline, concrete) 将起作用

"options": {
    "5": {
      "someName": true,
      "concreteValue": "important"
    }
  },

See this jsFiddle 产生这个结果:

【讨论】:

  • 创建嵌套对象而不是数组条目似乎确实有效:) 但我仍然希望能够使用数组。不得不考虑独特的名字是如此乏味;)
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多