【问题标题】:Merging two javascript objects into one? [duplicate]将两个javascript对象合并为一个? [复制]
【发布时间】:2018-10-15 00:45:33
【问题描述】:

我正在尝试将以下对象合并为一个,但到目前为止没有运气 - 我的 console.log 中的结构如下:

    2018-05-11 : {posts: 2} // var posts
    2018-05-11 : {notes: 1} // var notes

一旦合并,我希望它看起来像下面这样

2018-05-11 : {posts: 2, notes: 1}

我尝试过 object.assign() 但它只是删除了初始帖子数据 - 最好的方法是什么?

【问题讨论】:

  • Object.assign 应该可以工作。 Object.assign( a, b ) 如果你想将 b 添加到 a。 Object.assign( {}, a, b ) 如果您想将 a 和 b 添加到新对象。你能显示你试过的Object.assign() 代码吗?
  • 你看到this的问题了吗?
  • 请记住,keys 是独一无二的。像这样循环很容易。
  • @stdob-- AKA mods 这不是建议链接的副本,因为这个问题对每个对象都有相同的索引,由于浅拷贝而出现问题。
  • 这个问题会更清楚(更清楚地不是重复),Zabs 展示了他尝试过的代码 sn-p(没有做他想要的)。根据接受的答案,以及他对使用 object.assign 时出现问题的描述,他似乎将2018-05-11 : {posts: 2} 作为类似于{'2018-05-11': {posts: 2}} 的对象读入javascript。尝试合并两个这样的对象会遇到assign 是浅拷贝的问题。

标签: javascript json merge


【解决方案1】:

这是一个更通用的函数。它通过对象传播,并将合并到声明的变量中。

const posts = {  '2018-05-11': {    posts: 2  },  '2018-05-12': {    posts: 5  }};
const notes = {  '2018-05-11': {    notes: 1  },  '2018-05-12': {    notes: 3  }};

function objCombine(obj, variable) {
  for (let key of Object.keys(obj)) {
    if (!variable[key]) variable[key] = {};

    for (let innerKey of Object.keys(obj[key]))
      variable[key][innerKey] = obj[key][innerKey];
  }
}

let combined = {};
objCombine(posts, combined);
objCombine(notes, combined);
console.log(combined)

希望对您有所帮助。

【讨论】:

  • 注意:这既不是浅合并也不是深度合并。我不确定确切的术语,但它比浅层合并“更深一层”。足以解决OP的问题。深层等价物将 recurse:用objCombine(obj[key], variable[key]) 替换以for (let innerkey ... 开头的两行。我认为 - 未经测试。
【解决方案2】:

jQuery.extend() 可能会有所帮助。试试

$.extend(obj1, obj2)

【讨论】:

    【解决方案3】:

    您可以使用Object.assign() 执行以下操作:

    var posts = {'2018-05-11' : {posts: 2}} // var posts
    var notes = {'2018-05-11' : {notes: 1}} // var notes
    
    Object.assign(posts['2018-05-11'], notes['2018-05-11']);
    console.log(posts);

    【讨论】:

    • 请注意,这不会进行深度合并
    【解决方案4】:

    您需要像这样对每个项目应用分配:

    var a =  {"2018-05-11" : {notes: 1}};
    
    var b =  {"2018-05-11" : {posts: 3}};
    
    var result = {};
    
    Object.keys(a).forEach(k=>{result[k] = Object.assign(a[k],b[k])});
    
    console.log(result);

    【讨论】:

      【解决方案5】:

      您可以使用 Lodash 库中的 merge 方法。

      const posts = {'2018-05-11' : {posts: 2}}
      const notes = {'2018-05-11' : {notes: 1}}
      
      const result = _.merge({}, posts, notes);
      console.log(result)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

      【讨论】:

      • 我更喜欢 lodash,因为它提供了对诸如其中一个对象不是对象之类的东西的防御性,并防止讨厌的 js 错误...
      • @nenad 安装一个库来使用普通 JS 执行某些操作?我认为不是...
      • @Wancieho 没有人建议安装库。一个简单的事实是,我们大多数人使用库,并且很多人都在使用 lodash。如果你是,那么就像 cal_b 建议的那样,使用 merge 可能是值得的。
      • @Auspex 安装/嵌入任何你想称呼它的东西,这是不必要的开销。提供需要另一个不需要的依赖项的解决方案是不正确的。没有什么好争论的。
      • 如果您已经拥有 lodash,则没有开销。 SO 是关于获得尽可能多的答案,而不是一个理论上正确的答案。是的,没有证据表明它是 OP 的最佳答案,但我保证这将是一些来到这里的人的最佳答案
      【解决方案6】:

      var x =  {posts: 2};
      var y = {notes: 1};
      var z = Object.assign( {}, x, y );
      console.log(z);

      使用Object.assign() 并将对象属性分配给空对象。

      【讨论】:

      • 根据他要求的结果,这是完全错误的。
      • @Wancieho 根据 OP 要求的结果,这完全正确。你只是假设一个没有在证据中显示的数据结构。 MayK 的回答是正确的,但至少表明哪个数据结构是正确的。
      • @Auspex 嗯,你有没有看过这个答案的输出VS OP想要什么?此答案缺少2018-05-11
      • 不要侮辱。事实上,OP 并没有说明日期是关键。它说这些是 log 记录。你只是跳到一个假设。我不是没有阅读问题的人。
      • 可以从 OP 的声明中推断出 “我已经尝试过 object.assign() 但它只是删除了最初的帖子数据” 他有两个具有相同键的对象。所以这个答案对他没有帮助。或其他有类似症状的人。
      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多