合并2个没有重复内容的对象

时间:2017-09-20 16:32:44

标签: javascript javascript-objects

我试图将两个对象合并在一起,但是有可能存在X个重复项目。 作为一个例子,我已经有historyExisting,我想添加historyNew到它。你可以看到有重复

示例数据

var historyExisting =  { 
     '1505845390000': 295426,
     '1505757979000': 4115911,
     '1505677767000': 4033384,
     '1505675472000': 4033384,
     '1505591090000': 3943956
}

var historyNew = { 
     '1505675472000': 4033384,
     '1505591090000': 3943956,
     '1505502071000': 3848963,
     '1505499910000': 3848963,
     '1505499894000': 3848963
    }

期望的结果

var history = {
     '1505845390000': 295426,
     '1505757979000': 4115911,
     '1505677767000': 4033384,
     '1505675472000': 4033384,
     '1505591090000': 3943956,
     '1505502071000': 3848963,
     '1505499910000': 3848963,
     '1505499894000': 3848963
}

如您所见,结果仍按时间戳顺序保留,但任何重复都已删除。 我一直在尝试获取historyExisting中的最后一项key / value,在historyNew中找到它之前删除任何项目然后合并它们但它看起来非常笨重。

这是Node中的服务器端,因此不依赖于浏览器。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

使用Object.assign

(在Node.js 4及更高版本中支持)

var historyExisting = {
  '1505845390000': 295426,
  '1505757979000': 4115911,
  '1505677767000': 4033384,
  '1505675472000': 4033384,
  '1505591090000': 3943956
}

var historyNew = {
  '1505675472000': 4033384,
  '1505591090000': 3943956,
  '1505502071000': 3848963,
  '1505499910000': 3848963,
  '1505499894000': 3848963
}

var merged = Object.assign({}, historyExisting, historyNew);

console.log(merged);

其他选项:

如果您需要支持不支持Object.assign的浏览器(或环境),您可能已经在您的工具库中提供了一个工具,例如 jQuery的扩展,或 lodash的扩展和许多其他polyfill。如果您无法访问此类工具,则可以随时编写自己的工具:

function extend(base, ...objs) {
  objs.forEach(obj => {
    Object.keys(obj).forEach(key => {
      base[key] = obj[key];
    })
  });
  return base;
}

var historyExisting = {
  '1505845390000': 295426,
  '1505757979000': 4115911,
  '1505677767000': 4033384,
  '1505675472000': 4033384,
  '1505591090000': 3943956
}

var historyNew = {
  '1505675472000': 4033384,
  '1505591090000': 3943956,
  '1505502071000': 3848963,
  '1505499910000': 3848963,
  '1505499894000': 3848963
}

var merged = extend({}, historyExisting, historyNew);

console.log(merged);

答案 1 :(得分:0)

使用spread properties

const history = {...historyExisting, ...historyNew};

与`Object.assign({}几乎完全相同,你必须转换才能在节点或几乎任何浏览器中使用它。