Mise à jour du 12 octobre 2019
Nouvelle version basée uniquement sur le nouveau Javascript et ne nécessitant aucune bibliothèque tierce.
const mergeByProperty = (target, source, prop) => {
source.forEach(sourceElement => {
let targetElement = target.find(targetElement => {
return sourceElement[prop] === targetElement[prop];
})
targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);
})
}
var target /* arr1 */ = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var source /* arr2 */ = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];
mergeByProperty(target, source, 'name');
console.log(target)
Cette réponse commençait à dater, des librairies comme lodash et underscore sont beaucoup moins nécessaires de nos jours. Dans cette nouvelle version, le cible (arr1) array est celui avec lequel nous travaillons et que nous voulons maintenir à jour. Le site source (arr2) est l'endroit d'où proviennent les nouvelles données, et nous voulons qu'elles soient fusionnées avec notre cible le tableau.
Nous bouclons sur le source à la recherche de nouvelles données, et pour chaque objet qui n'est pas encore trouvé dans notre cible nous ajoutons simplement cet objet en utilisant target.push(sourceElement) Si, sur la base de notre propriété clé ('name') Si un objet se trouve déjà dans notre tableau cible, nous mettons à jour ses propriétés et ses valeurs en utilisant la méthode suivante Object.assign(targetElement, sourceElement) . Notre "cible" sera toujours le même tableau, avec un contenu actualisé.
Ancienne réponse utilisant l'underscore ou le lodash
J'arrive toujours ici depuis google et je ne suis toujours pas satisfait des réponses. Votre réponse est bonne mais ce serait plus facile et plus propre d'utiliser underscore.js.
DEMO : http://jsfiddle.net/guya/eAWKR/
Voici une fonction plus générale qui fusionnera deux tableaux en utilisant une propriété de leurs objets. Dans ce cas, la propriété est 'name'.
var arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];
function mergeByProperty(arr1, arr2, prop) {
_.each(arr2, function(arr2obj) {
var arr1obj = _.find(arr1, function(arr1obj) {
return arr1obj[prop] === arr2obj[prop];
});
arr1obj ? _.extend(arr1obj, arr2obj) : arr1.push(arr2obj);
});
}
mergeByProperty(arr1, arr2, 'name');
console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>
[{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]