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

plu*_*us- 1 javascript arrays

var array1 = [{ "name" : "foo" , "age" : "22"}, { "name" : "bar" , "age" : "33"}];
var array2 = [{ "name" : "foo" , "age" : "22"}, { "name" : "buz" , "age" : "35"}];
Run Code Online (Sandbox Code Playgroud)

什么是最快的方式(没有重复,名称是标识符):

[{ "name" : "foo" , "age" : "22"}, { "name" : "bar" , "age" : "33"}, { "name" : "buz" , "age" : "35"}];
Run Code Online (Sandbox Code Playgroud)

有和没有jquery如果可能的话.

jfr*_*d00 5

这是一个通用函数,它将合并任意数量的数组,防止传入密钥的重复.

在合并时,它会创建到目前为止使用的名称的临时索引,并且只合并具有唯一名称的新元素.这个临时索引应该比通过结果的线性搜索快得多,特别是当数组变大时.作为此方案的一项功能,它可以过滤所有重复项,甚至是可能位于其中一个源阵列中的重复项.

如果一个元素没有keyName,则跳过它(虽然如果你想要的话,可以反转这个逻辑,取决于你想要的错误处理):

var array1 = [{ "name" : "foo" , "age" : "22"}, { "name" : "bar" , "age" : "33"}];
var array2 = [{ "name" : "foo" , "age" : "22"}, { "name" : "buz" , "age" : "35"}];

function mergeArrays(keyName /* pass arrays as additional arguments */) {
    var index = {}, i, len, merge = [], arr, name;

    for (var j = 1; j < arguments.length; j++) {
        arr = arguments[j];
        for (i = 0, len = arr.length; i < len; i++) {
            name = arr[i][keyName];
            if ((typeof name != "undefined") && !(name in index)) {
                index[name] = true;
                merge.push(arr[i]);
            }
        }
    }
    return(merge);
}

var merged = mergeArrays("name", array1, array2);

// Returns:
// [{"name":"foo","age":"22"},{"name":"bar","age":"33"},{"name":"buz","age":"35"}]
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到它的工作:http://jsfiddle.net/jfriend00/8WfFW/

当使用更大的数组对jsperf中的Matt算法运行此算法时,此算法的速度提高约20倍:

在此输入图像描述