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倍: