用条件组合/扩展两个对象

时间:2015-09-03 09:38:50

标签: javascript

我有两个对象

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中实现。我无法使用其他任何东西。

2 个答案:

答案 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>

哪个会给你:

console

在上面的代码片段中,我包含了一个完整的es6 polyfill,但是this polyfill here只包含你要查找的内容,如果你想避免加载大量无用的代码(我无法轻松加载它),可能会更好片段)。 如果您使用jQueryunderscore,它们也会提供extend方法,您可以使用该方法代替填充。

警告!正如您所看到的,这实际上将覆盖obj1obj2内容为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>

Console

请注意,某些覆盖仍然可能发生(第一个对象的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添加条件来验证其他校准。