私は自分のプロジェクトに取り組んでいるときに同じ問題に直面しました。したがって、jqueryを拡張して、そのプロパティに基づいて配列のマージを実行します。プロパティに基づいて配列をマージする場合は、マージ関数の最後のパラメータとしてプロパティ名を渡します。jsfiddleを作成しました。ブラウザコンソールの結果を参照してください。
function merge() {
var options, name, src, copy, copyIsArray, clone, targetKey, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;
var currentId = typeof arguments[length - 1] == 'string' ? arguments[length - 1] : null;
if (currentId) {
length = length - 1;
}
// Handle a deep copy situation
if (typeof target === "boolean") {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// Handle case when target is a string or something (possible in deep
// copy)
if (typeof target !== "object" && !jQuery.isFunction(target)) {
target = {};
}
// extend jQuery itself if only one argument is passed
if (length === i) {
target = this;
--i;
}
for (; i < length; i++) {
// Only deal with non-null/undefined values
if ((options = arguments[i]) != null) {
// Extend the base object
for (name in options) {
if (!options.hasOwnProperty(name)) {
continue;
}
copy = options[name];
var mm = undefined, src = undefined;
if (currentId && jQuery.isArray(options) && jQuery.isArray(target)) {
for (mm = 0; mm < target.length; mm++) {
if (currentId && (isSameString(target[mm][currentId], copy[currentId]))) {
src = target[mm];
break;
}
}
}
else {
src = target[name];
}
// Prevent never-ending loop
if (target === copy) {
continue;
}
targetKey = mm !== undefined ? mm : name;
// Recurse if we're merging plain objects or arrays
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];
}
else {
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
if (currentId) {
target[targetKey] = merge(deep, clone, copy, currentId);
}
else {
target[targetKey] = merge(deep, clone, copy);
}
// Don't bring in undefined values
}
else if (copy !== undefined) {
target[targetKey] = copy;
}
}
}
}
// Return the modified object
return target;
};
function isSameString (a , b){
return a && b && String(a).toLowerCase() === String(b).toLowerCase();
}
obj1 = [ {
id : "id1",
name : "name1"
}, {
id : "id2",
name : "name2"
} ]
obj2 = [ {
id : "id3",
name : "name3"
}, {
id : "id1",
name : "name1_modified"
} ];
console.log(merge(true, obj1, obj2, "id"));