如何在Javascript中合并对象数组?

use*_*889 5 javascript

例:

var array1 = [ {'key':1, 'property1': 'x'}, {'key':2, 'property1': 'y'} ]
var array2 = [ {'key':2, 'property2': 'a'}, {'key':1, 'property2': 'b'} ]
Run Code Online (Sandbox Code Playgroud)

我想合并(array1,array2)给我:

[
    {'key':1, 'property1': 'x', 'property2' : 'b'},
    {'key':2, 'property1': 'y', 'property2' : 'a'}
]
Run Code Online (Sandbox Code Playgroud)

是否有捷径可寻?

编辑:有几个人已经回答,没有仔细看我的问题,请注意我想匹配每个数组中的类似对象,并将他们的属性组合到我的最终数组.键是唯一的,每个阵列中最多只有一个具有特定键的对象.

roy*_*wie 3

我写了一个快速但不太快速的解决方案。您可能需要考虑的一个问题是,第二个数组中的对象的属性是否应该覆盖与之比较的第二个对象中的相同属性(如果存在)。

\n\n

解决方案1

\n\n

这个解决方案很复杂O(n\xc2\xb2)。解决方案2要快得多;此解决方案仅适用于那些不想快速成为刺猬 Sanic 的人。

\n\n

JavaScript

\n\n
var mergeByKey = function (arr1, arr2, key) {\n// key is the key that the function merges based on\n    arr1.forEach(function (d, i) {\n        var prop = d[key];\n        // since keys are unique, compare based on this key\'s value\n        arr2.forEach(function (f) {\n            if (prop == f[key]) {    // if true, the objects share keys\n                for (var x in f) {   // loop through each key in the 2nd object\n                    if (!(x in d))   // if the key is not in the 1st object\n                        arr1[i][x] = f[x];    // add it to the first object\n                // this is the part you might want to change for matching properties\n                // which object overrides the other?\n                }\n            }\n        })\n    })\n    return arr1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试用例

\n\n
var arr = [ {\'key\':1, \'property1\': \'x\'},\n            {\'key\':2, \'property1\': \'y\'} ],\n    arr2= [ {\'key\':2, \'property2\': \'a\'},\n            {\'key\':1, \'property2\': \'b\'} ];\n\nconsole.log(mergeByKey(arr, arr2, "key"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n
/* returns:\n    Object\n    key: 1\n    property1: "x"\n    property2: "b"\n    __proto__: Object\nand \n    Object\n    key: 2\n    property1: "y"\n    property2: "a"\n    __proto__: Object\n*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

小提琴

\n\n

解决方案2

\n\n

正如Vivin Paliath在下面的评论中指出的那样,我的第一个解决方案很O(n\xc2\xb2)复杂(读作:糟糕)。他的答案非常好,并提供了复杂度为 的解决方案O(m + n),其中是第一个数组和第二个数组的m大小。n换句话说,复杂性O(2n)

\n\n

然而,他的解决方案并没有解决对象中的对象。为了解决这个问题,我使用了 recursion\xe2\x80\x94read: 魔鬼,就像O(n\xc2\xb2).

\n\n

JavaScript

\n\n
var mergeByKey = function (arr1, arr2, key) {\n    var holder = [],\n        storedKeys = {},\n        i = 0; j = 0; l1 = arr1.length, l2 = arr2.length;\n\n    var merge = function (obj, ref) {\n        for (var x in obj) {\n            if (!(x in ref || x instanceof Object)) {\n                ref[x] = obj[x];\n            } else {\n                merge(obj[x], ref[x]);\n            }\n        }\n        storedKeys[obj.key] = ref;\n    }\n    for (; i < l1; i++) {\n        merge(arr1[i], storedKeys[arr1[i].key] || {});\n    }\n    for (; j < l2; j++) {\n        merge(arr2[j], storedKeys[arr2[j].key] || {});\n    }\n\n    delete storedKeys[undefined];\n\n    for (var obj in storedKeys)\n        holder.push(storedKeys[obj]);\n\n    return holder;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试用例

\n\n
var arr1 = [\n    {\n        "key" : 1,\n        "prop1" : "x",\n        "test" : {\n            "one": 1,\n            "test2": {\n                "maybe" : false,\n                "test3": { "nothing" : true }\n            }\n        }\n    },\n    {\n        "key" : 2,\n        "prop1": "y",\n        "test" : { "one": 1 }\n    }],\n    arr2 = [\n        {\n            "key" : 1,\n            "prop2" : "y",\n            "test" : { "two" : 2 }\n        },\n        {\n            "key" : 2,\n            "prop2" : "z",\n            "test" : { "two": 2 }\n        }];\nconsole.log(mergeByKey(arr1, arr2, "key"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n
/*\nObject\n    key: 1\n    prop1: "x"\n    prop2: "y"\n    test: Object\n        one: 1\n        test2: Object\n            maybe: false\n            test3: Object\n                nothing: true\n                __proto__: Object\n            __proto__: Object\n        two: 2\n        __proto__: Object\n    __proto__: Object\nObject\n    key: 2\n    prop1: "y"\n    prop2: "z"\n    test: Object\n        one: 1\n        two: 2\n        __proto__: Object\n    __proto__: Object\n*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会正确合并对象以及所有子对象。该解决方案假设匹配的对象keys具有相同的层次结构。它也不处理两个数组的合并。

\n\n

小提琴

\n