javascript - 根据条件组合/扩展两个对象

标签 javascript

我有两个对象

object = {
  id: 1,
  Oid: 'ff2d344e-77e8-43b3-a6f3-bfba577d6abd',
  name: 'Some name'
}

object2 = {
  id: 3,
  array_ref: 'ff2d344e-77e8-43b3-a6f3-bfba577d6abd',
  value1: 'Additional Data',
  value2: 'Some other additional data'
}

如您所见,这些对象之间的唯一引用是 Oid 和 Array_ref。现在我想将这些对象绑定(bind)到 Oid 和 Array_ref 匹配的对象上。最后我必须多次执行此操作(使用多个对象)。

有什么简单的方法可以做到这一点吗?

此代码部分使用 Angular 在 JavaScript 中实现。我无法使用其他任何东西。

最佳答案

您使用的不是数组(也不是 JSON)而是对象。

如果您想合并两个对象,一种解决方案是使用 next Javascript API (ES6) Object.assign method通过 polyfill(polyfill 使您能够使用尚不支持的标准 API):

var obj1 = {
  id: 1,
  Oid: 'ff2d344e-77e8-43b3-a6f3-bfba577d6abd',
  name: 'Some name'
}

var obj2 = {
  id: 3,
  array_ref: 'ff2d344e-77e8-43b3-a6f3-bfba577d6abd',
  value1: 'Additional Data',
  value2: 'Some other additional data'
}

var obj3 = Object.assign({}, obj1, obj2);

console.log(obj3);
<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.33.3/es6-shim.js"></script>

这会给你:

console

在上面的代码片段中,我包含了整个 es6 polyfill,但是 this polyfill here只包含您正在寻找的内容,如果您想避免加载一大堆无用的代码(我无法轻松地将其加载到代码片段中),那么可能会更好。 如果您使用jQueryunderscore ,他们还都提供了 extend您可以使用该方法来代替 polyfill。

警告! 如您所见,这实际上会覆盖 obj1 中的所有内容。这也在 obj2 中内容为obj2 。例如,生成的对象具有 idobj2 。如果您正在寻找更聪明的合并方式,则需要采用更复杂的算法。

如果您只想合并具有相同 id 的对象,我会使用 underscore :

var objectList = [
  { id: 1, val: "val1", otherVal: "val2" },
  { id: 2, val: "val3" },
  { id: 1, val: "val4", differentVal: "val5" }
];

// group objects by ids
var groups = _.groupBy(objectList, 'id');

// merge the groups
var mergedObjects = _.map(groups, function(objects){
  // Adds a new empty object at the beginning of the list
  // to avoid modifying the original objects.
  // It will be the destination of _.extend.
  objects.unshift({});
  // use extend with apply so we can provide it an array to be used as arguments
  return _.extend.apply(_, objects);
});

console.log(mergedObjects);
<script src="http://underscorejs.org/underscore-min.js"></script>

Console

请注意,仍然可能会发生一些覆盖(此处第一个对象的 val 被第三个对象的 val 覆盖)。

编辑:正如评论中指出的,lodash可能是比下划线更好的解决方案。 Read here关于 lodash 与下划线。

关于javascript - 根据条件组合/扩展两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372082/

相关文章:

javascript - 在另一个浏览器中从网络套接字接收返回的消息

javascript - Google Place Autocomplete Address Form 结合了 street_number 和 route 字段

JavaScript 从数组中过滤数据

javascript - 如何获取AngularJS中ng-repeat选项数组中的子值?

javascript - 通过设置 width=0 隐藏容器,但有时容器内的一些元素在容器隐藏后会短暂地保持可见

javascript - 3 条简单的 Javascript 行不起作用!

javascript - React native flexbox - 如何做百分比 ||列 ||响应 ||网格等

javascript - 实时更新有问题

javascript - 使用正则表达式在等号后显示文本?

javascript - 如何将写入文本形式的信息翻译成javascript?