Comment ajouter des propriétés de cet objet à un autre objet?

Donné

var obj1 = { a: 'cat' b: 'dog' }; var obj2 = { b: 'dragon' c: 'cow' }; 

Comment puis-je ajouter des propriétés d' obj2 à obj1 sans écraser à obj1 . La sortie devrait être comme console.log(obj1) => {a: 'cat', b: 'dog', c: 'cow'} et console.log(obj2) => {b: 'dragon', c: 'cow'}

Il suffit de vérifier s'il existe d'abord et s'il ne l'ajoute pas!

 for (key in obj2) { if (!obj1[key]) obj1[key] = obj2[key] } 

Comme RobG l'a souligné dans les commentaires, cela ne fonctionnera pas si vos valeurs sont fausses (0, fausses, non définies, null, '', etc.) et elles passeront devant elles. Si vous utilisez toujours des chaînes, comme dans votre exemple, cela ira bien, mais vous pourriez être sûr et complet:

 for (key in obj2) { if (!(obj1.hasOwnProperty(key))) { obj1[key] = obj2[key] } } 

Solution:

 obj1 = {...obj2, ...obj1}; 

Cette solution ne fonctionne que si vous savez quelles sont les valeurs attendues, par exemple, vous savez qu'elles seront toutes des chaînes non vides. Cela utilise la syntaxe de propagation d'objet. Vous devez vous assurer d'inclure obj1 last. Vous pouvez avoir besoin d'un transpiler tel que babel jusqu'à ce que tous les navigateurs (IE …) se rattrapent.

 let obj1 = { a: 'cat', b: 'dog' }; let obj2 = { b: 'dragon', c: 'cow' }; obj1 = {...obj2, ...obj1}; console.log('obj1:', obj1); console.log('obj2:', obj2); 

Pour copier des propriétés d'un objet à un autre, Object.assign . Cependant, il écrasera les valeurs de l'objet cible si une propriété similaire est sur la source.

Vous pouvez créer une méthode assignSoft qui n'écrase pas les valeurs des propriétés existantes. Ce qui suit est basé sur le polyfill Object.assign à MDN. Il semble un peu long car il implémente l'algorithme ECMAScript pour Object.assign le plus près possible.

En outre, comme l'objet Object.assign , il n'y a qu'une copie "peu profonde" pour que les valeurs d'objet ne soient pas copiées, une référence est attribuée.

 if (typeof Object.assignSoft != 'function') { Object.assignSoft = function(target, varArgs) { // .length of function is 2 'use strict'; if (target == null) { // TypeError if undefined or null throw new TypeError('Cannot convert undefined or null to object'); } var to = Object(target); for (var index = 1; index < arguments.length; index++) { var nextSource = arguments[index]; if (nextSource != null) { // Skip over if undefined or null for (var nextKey in nextSource) { // Avoid bugs when hasOwnProperty is shadowed // Don't copy if property exists on target if (Object.prototype.hasOwnProperty.call(nextSource, nextKey) && !Object.prototype.hasOwnProperty.call(to, nextKey)) { to[nextKey] = nextSource[nextKey]; } } } } return to; }; } var obj = Object.assignSoft({a:'a',b:'b'},{b:'bb',c:'c'}); console.log(obj); // {a:'a',b: 'b',c:'c'}