2017-05-31 1 views
0

Ich möchte wissen, ob es eine native Möglichkeit gibt, ein Objekt niederzuschlagen.Javascript Downcasting-Objekt

Ich meine, wenn ich ein Objekt wie dieses: person1 = {name: 'Doe', age: 25};

Und andere wie: person2 = {name: ''};

Gibt es somefunction, die verwendet werden können, wie etwas zu tun: var person = somefunction(person2, person1); Und person = {name: 'Doe'} bekommen?

Oder gibt es einen Ansatz mit Prototypen?

Danke.

+1

Warum brauchen Sie auch auf „gesenkten“ oder? Ist es wichtig, ob das Objekt zusätzliche Eigenschaften hat? –

+0

Ja, es ist wichtig. Ich weise eine Variable dem vom IBM BPM Framework definierten Typ zu. Wenn ich zusätzliche Eigenschaften habe, heißt das, dass sie nicht im Datentyp definiert sind. –

+0

@JosueGarcia Also das Framework wirft einen Fehler, wenn es zusätzliche Daten gibt? Wenn nicht, gibt es keinen Grund, die zusätzlichen Eigenschaften zu entfernen. Wenn ja, habe ich unten eine Antwort gegeben. –

Antwort

0

Kennen Sie den Namen der Eigenschaften, die Sie entfernen möchten? Wenn ja, warum nicht einfach den spezifischen Schlüssel vom Objekt löschen?

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

 
delete person1['age']; 
 

 
console.log(person1);

1

Sie eine Funktion schreiben könnte, die von einem Objekt zusätzliche Eigenschaften abstreift.

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

Ich würde nur raten, 'Schnittstelle' als Parameternamen zu verwenden, da es ein * zukünftiges reserviertes Schlüsselwort * in JS ist. Keine wirklichen Anwendungsfälle AFAIK obwohl, zumindest für jetzt –

+0

@ NicholasKyriakides Guter Punkt. In "interf" umbenannt. –

0

Sicher, eine solche Funktion vorhanden ist:

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

Ich bin nicht wirklich sicher über die gesenkten Konzept, aber für diesen I denke ich würde Object.assign() verwenden, mit der enumerable Eigenschaft:

"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' } 

Es ist unbedingt viele Möglichkeiten, dies zu tun, wie es in den anderen Antworten vorgeschlagen, und man kann es auf jeden Fall einen Prototyp machen, wenn man es auf diese Weise benötigen.

edit:
Ich weiß, mein erster Versuch gar nicht sehr gut war, wie es Anfangs-Objekte ändern.
ich dies nutzen, um es einfach:

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' } 
Verwandte Themen