我有两个对象
object2 = {
id: 3,
array_ref: 'ff2d344e-77e8-43b3-a6f3-bfba577d6abd',
value1: 'Additional Data',
value2: 'Some other additional data'
}
和
library(gmp)
as.bigz(factorize( 113423713055421844361000443))
Big Integer ('bigz') object of length 38:
# [1] 2 2 2 2 2 2 2 2 2 2 2
# [12] 2 2 2 2 2 2 2 2 2 2 2
# [23] 2 2 2 2 2 2 2 2 2 2 2
# [34] 2 3 647 1134247 2998823
如您所见,这些对象之间唯一的引用是Oid和Array_ref。现在我想将这些对象绑定到Oid和Array_ref匹配的位置。最后,我必须多次这样做(使用多个对象)。
有一些简单的方法吗?
此代码部分使用角度在JavaScript中实现。我无法使用其他任何东西。
答案 0 :(得分:1)
您不是使用数组(也不是JSON)而是使用对象。
如果要合并两个objets,一个解决方案是通过polyfill使用 next Javascript API(ES6)Object.assign
method(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
方法,您可以使用该方法代替填充。
警告!正如您所看到的,这实际上将覆盖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
覆盖了。)
编辑正如评论中所指出的,lodash可能是一个比下划线更好的解决方案。 Read here关于lodash vs.下划线。
答案 1 :(得分:0)
这是一个简单的方法。
您的object
可能如下所示:
{
'ff2d344e-77e8-43b3-a6f3-bfba577d6abd': {
id: 1,
name: 'Some name'
}
}
然后你这样访问它:
object[object2.array_ref]
你会得到你想要的所有数据。
稍后,您可以使用for( in )
循环向该对象添加属性:
var obj = object[object2.array_ref];
for(var k in object2)
{
if( !(k in obj) && object2.hasOwnProperty(k))
{
obj[k] = object2[k];
}
}
如果对象尚未存在,则会将值添加到对象中。
您可以通过向if
添加条件来验证其他校准。