2017-05-31 2 views
0

オブジェクトをダウンキャストするネイティブな方法があるかどうかを知りたい。JavaScriptのダウンキャストオブジェクト

私が意味する、私はこのようなオブジェクトを持っている場合:person1 = {name: 'Doe', age: 25};

などその他:var person = somefunction(person2, person1);person = {name: 'Doe'}を得る:person2 = {name: ''};

のようなものを行うために使用することができsomeFunctionはありますか?

プロトタイプのアプローチはありますか?

ありがとうございました。

+1

あなたも、それを「ダウンキャスト」必要があるのはなぜ?オブジェクトに追加のプロパティがあるかどうかは重要ですか? –

+0

はい、重要です。私は、IBM BPMフレームワークによって定義されたタイプの変数を割り当てています。余分なプロパティがある場合は、データ型で定義されていないと言います。 –

+0

@JosueGarcia余分なデータがあるとフレームワークはエラーを投げますか?そうでない場合は、追加のプロパティを削除する必要はありません。もしそうなら、私は以下の答えを与えました。 –

答えて

0

あなたが削除しようとしているプロパティの名前を知っていますか?もしそうなら、オブジェクトから特定のキーを削除するだけではどうですか?

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

 
delete person1['age']; 
 

 
console.log(person1);

1

あなたがオブジェクトから余分な性質を取り除き機能を記述することができます。

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

私はJSで*将来の予約キーワード*であるので、 'interface'をパラメータ名として使用するのをやめてください。実際の使用例はありませんが、少なくとも今のところはAFAIKです。 –

+0

@NicholasKyriakides良い点。 'interf'に改名しました。 –

0

確かに、このような関数が存在します。

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

私は意気消沈概念については本当にわからないんだけど、そのIについて私はObject.assign()を使用すると思います。列挙プロパティ:

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

他の回答で提案されているように、これを行うには、必ずしも多くの方法があり、そしてあなたがそれそのように必要がある場合は確かにそれをプロトタイプを作ることができます。

編集:
私はそれが最初のオブジェクトを変更すると、私の最初の試みは全く非常によくありませんでした実現。
私はそれをよりシンプルにするためにこれを利用:

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