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