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

标签 javascript arrays

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

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

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

如果可能,使用或不使用 jquery。

最佳答案

这是一个通用函数,可以合并任意数量的数组,防止传入的键重复。

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

如果一个元素没有 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"}]

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

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

enter image description here

关于javascript - 在 Javascript 中,如何合并对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671809/

相关文章:

javascript - jQuery 表排序器 : stop sorting

javascript - 使用搜索框通过 javascript 更改图像

php将字符串匹配到多个关键字数组

javascript - 谁能解释为什么这不起作用?

c - C语言求第一个正元素和最后一个负元素的位置和值

c - Arduino/C : Convert byte array to string or other comparable text format

javascript - 如何在 Typescript 中描述原型(prototype)继承?

javascript - 网络音频增益节点可以控制其他增益节点吗?

php - 合并两个数组,同时保留数字键

php - 有什么方法可以捕获页面刷新并暂停它吗?