【问题标题】:Merge two objects when there's a new key有新键时合并两个对象
【发布时间】:2016-05-01 04:07:22
【问题描述】:

我有两个具有以下结构的对象并尝试将它们合并在一起。

我用 $.merge 尝试过,但不是预期的结果。

对象 1 - 没有所有属性

{
    "id": 23,
    "name": "Article",
    "related": 15 "items": [{
        "name": "Test1",
        "items": [{
            "name": "Test2",
            "items": [{
                "name": "Test3",
                "items": [{
                    "name": "Test4",
                    "items": [{
                        "name": "Test5",
                        "items": [{
                            "name": "Test6",
                        }]
                    }]
                }]
            }]
        }]
    }]
}, {
    "id": 24…
}

对象 2 - 具有附加属性

{
    "id": 23,
    "name": "Article",
    "related": 15 "items": [{
        "name": "Test1",
        "id": 34 "items": [{
            "name": "Test2",
            "id": 57 "items": [{
                "name": "Test3",
                "id": 92 "items": [{
                    "name": "THIS ONE IS NOT EXISTING IN OBJECT 1 AND SHOULD NOT GET MERGED",
                    "id": 789
                }, {
                    "name": "Test4",
                    "id": 12 "items": [{
                        "name": "Test5",
                        "id": 321 "items": [{
                            "name": "Test6",
                            "id": 285
                        }]
                    }]
                }]
            }]
        }]
    }]
}, {
    "id": 24…
}

有人知道一些聪明的技巧吗? jQuery 甚至是必要的吗?

【问题讨论】:

  • 不需要 jquery,你需要 1 或 2 个 for 循环和一个递归函数。
  • @nem:“此功能是非标准的,不在标准轨道上。请勿在面向 Web 的生产站点上使用它”。有史以来最好的提示
  • 不清楚你要求什么。对象 2 已经是对象 1 和对象 2 的合并,因此只需使用对象 2 即可。也许你的意思是当两者都有“新事物”时?
  • @pid 我有对象,其中一个具有不同的附加属性。合并的对象应该包含这些。
  • 你意识到你给出的例子不是一个好例子吗?当两者都具有新属性时,它是不必要的麻烦并且不显示一般情况。此外,您是否意识到您可以有碰撞?如果两者都用不同的值重新定义相同的属性,你会选择哪一个?通常情况下,无法处理冲突,应该抛出异常。

标签: javascript jquery object merge


【解决方案1】:

没有 jquery:https://jsfiddle.net/sLhcbewh/

function mymerge_sub(object1, object2)
{
  for(var i in object2) {
    if(i == 'items')
      continue;

    console.log(i);
    if(object1[i] === undefined) {
      console.log(i + ' not found');
      object1[i] = object2[i];
    }
  }

  if(object1.items !== undefined) {
    mymerge_sub(object1.items[0], object2.items[0])
  }
}

function mymerge(object1, object2) {
  var ret = JSON.parse(JSON.stringify(object1));
  mymerge_sub(ret, object2); // save obj 1
  return ret;
}

var obj3 = mymerge(obj1, obj2);

如果你想要几个项目,你必须循环 mymerge_sub(object1.items[j]... )。

【讨论】:

  • @charlietfl:他要求合并新密钥,但他没有告诉他要合并现有密钥。如果是这样,他必须删除此代码中的一个条件 (omg)。
  • 合并和覆盖不是一回事。另请注意,这些对象现在是彼此的引用。不清楚是否可以
  • ……我编辑了描述。我认为第一个描述具有误导性。
【解决方案2】:

jQuery 的 $.extend 会做你想做的事。

//merging two objects into new object
var new_object = $.extend(true, {}, object1, object2);

//merge object2 into object1
$.extend(true, object1, object2);

第一个参数:deep:true,见:https://api.jquery.com/jquery.extend/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2018-04-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多