我有两个对象
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>
这会给你:
在上面的代码片段中,我包含了整个 es6 polyfill,但是 this polyfill here只包含您正在寻找的内容,如果您想避免加载一大堆无用的代码(我无法轻松地将其加载到代码片段中),那么可能会更好。
如果您使用jQuery或underscore ,他们还都提供了 extend
您可以使用该方法来代替 polyfill。
警告! 如您所见,这实际上会覆盖 obj1
中的所有内容。这也在 obj2
中内容为obj2
。例如,生成的对象具有 id
的obj2
。如果您正在寻找更聪明的合并方式,则需要采用更复杂的算法。
如果您只想合并具有相同 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>
请注意,仍然可能会发生一些覆盖(此处第一个对象的 val
被第三个对象的 val
覆盖)。
关于javascript - 根据条件组合/扩展两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372082/