2017-05-31 4 views
0

Je veux savoir s'il existe un moyen natif pour faire tomber un objet.Objet de rétrogradation Javascript

Je veux dire, si j'ai un objet comme celui-ci: person1 = {name: 'Doe', age: 25};

Et d'autres comme: person2 = {name: ''};

Y at-il someFunction qui peut être utilisé pour faire quelque chose comme: var person = somefunction(person2, person1); Et se person = {name: 'Doe'}?

Ou y at-il une approche avec des prototypes?

Merci.

+1

Pourquoi avez-vous besoin même « baissés » il? Est-ce important si l'objet a des propriétés supplémentaires? –

+0

Oui, c'est important. J'affecte une variable au type défini par IBM BPM Framework. Si j'ai des propriétés supplémentaires, il est dit qu'elles ne sont pas définies dans le type de données. –

+0

@JosueGarcia Le framework génère donc une erreur s'il y a des données supplémentaires? Sinon, il n'y a aucune raison de supprimer les propriétés supplémentaires. Si oui, j'ai donné une réponse ci-dessous. –

Répondre

0

Connaissez-vous le nom des propriétés que vous souhaitez supprimer? Si oui, pourquoi ne pas simplement supprimer la clé spécifique de l'objet?

var person1 = { 
 
    name: 'Doe', 
 
    age: 25 
 
}; 
 

 
delete person1['age']; 
 

 
console.log(person1);

1

Vous pouvez écrire une fonction qui effeuille des propriétés supplémentaires d'un objet.

function removeExtraProperties(interf, obj) { 
 
    let interfaceKeys = Object.keys(interf); 
 
    for (let key in obj) { 
 
    if (!obj.hasOwnProperty(key)) { 
 
     // Make sure we don't strip off inherited properties 
 
     // Remove this if you want to 
 
     continue; 
 
    } 
 
    
 
    if (!interfaceKeys.includes(key)) { 
 
     delete obj[key]; 
 
    } 
 
    } 
 
} 
 

 
let person = { firstName: '' }; 
 
let bob = { firstName: 'Bob', lastName: 'Smith' }; 
 
removeExtraProperties(person, bob); 
 
console.log(bob);

+0

Je ne ferais que décourager l'utilisation de 'interface' comme nom de paramètre, car c'est un mot-clé * futur réservé dans JS. Aucun cas d'utilisation réel AFAIK cependant, au moins pour l'instant –

+0

@NicholasKyriakides Bon point. Renommé à 'interf '. –

0

Bien sûr, une telle fonction existe:

function filterObj(p2, p1) { 
 
    return Object.keys(p2).reduce(function (build, el) { 
 
    build[el] = p1[el]; 
 
    return build; 
 
    }, {}); 
 
} 
 

 
person1 = {name: 'Doe', age: 25}; 
 
person2 = {name: ''}; 
 

 
console.log(filterObj(person2, person1));

0

Je ne suis pas vraiment sûr de la baissés notion, mais pour que je pense que je voudrais utiliser Object.assign(), en utilisant le propriété dénombrable:

"use strict" 

let person1 = { name: 'Doe', age: 25 } 
let person2 = { name: '' } 

for (let key in person1) { 
    if (!person2.hasOwnProperty(key)) { 
    Object.defineProperty(person1, key, { enumerable: false }) 
    } 
} 

let person = Object.assign(person2, person1) 
console.log(person) // { name: 'Doe' } 

Il y a forcément beaucoup de façons de le faire, comme l'a suggéré dans les autres réponses, et vous pouvez certainement en faire un prototype si vous avez besoin de cette façon.

modifier:
Je réalise ma première tentative ne fut pas très bon du tout comme il changer les objets initiaux.
Je profite de cela pour le rendre plus simple:

let Person = function() {} 
Person.prototype.downcast = function (p1, p2) { 
    let c = {} 
    for (let k in p1) { 
    if (p2.hasOwnProperty(k)) { 
     c[k] = p1[k] 
    } 
    } 
    return c 
} 

let person = new Person().downcast(person1, person2)  
console.log(person) // { name: 'Doe' }