2016-07-07 2 views
1

を存在する場合にのみターゲットにコピーします。ES6は性質が、彼らはすでに私が</p> <pre><code>let schema = { name: null, lastname: null } let values = { name: "John", unwanted: "haxor" } </code></pre> <p>がで終わるしたい基本的に何

簡単な方法はありますか?

編集:これは、低ダッシュやアンダースコアのようなライブラリを使用しないようにするためです。ソリューションが過度に複雑な場合は、望ましい解決策になります。

+0

単純な更新ルーチンを書いてください。浅いコピーが必要なだけなので、割り当て部分に条件を入れて、Object.assignポリフィルをフォークすることができます。 – dandavis

+0

浅いコピーが必要で、getterやsetterではない列挙可能な独自のプロパティをサポートするためにのみ必要ですか? – Ben

+0

浅いコピーは大丈夫ですが、値のプロパティが何を意味するのかは不明です。 (プロトタイププロパティは必要ありませんが、それはあなたが意味するものです) – Dan

答えて

4

に設定されていないだけである特性を保証します。しかし、それを行う簡単な(ほとんど些細な)方法があります:

const sanitized = {}; 
for (const p in schema) 
    sanitized[p] = (p in object ? object : schema)[p]; 
+0

質問を更新しましたが、デフォルト値をスキーマからコピーする必要があるオブジェクトがvaluesオブジェクトに存在しない場合はtrueを返します。 – Dan

+0

@ダン:ああ、私は見るが、これまでのところ答えはどれもそれを考慮していない。しかし、追加するのは非常に簡単です:-) – Bergi

+0

ありがとうございます。これは最も洗練されたソリューションであるようです。それを通って私は答えが事実であると結論づけることができます。再度、感謝します。 – Dan

0

はOPのもう少し複雑な要求

個々のオブジェクトにだけmap値のスキーマのキーに編集し、それらを広めます。あなたは、schemaを上書きしたいObject.assign()に異なるtargetを指定しない場合

Object.assign(
    schema, 
    ...Object.keys(schema).map(
    (key) => ({[key]: schema[key]}) 
), 
    ...Object.keys(schema).map(
    (key) => ({[key]: values[key]}) 
) 
); 

let sanitized = Object.assign(
    {}, 
    ...Object.keys(schema).map(
    (key) => ({[key]: schema[key]}) 
), 
    ...Object.keys(schema).map(
    (key) => ({[key]: values[key]}) 
) 
); 

@Bergi's answerに近いパターンに続いて、あなたが少なく何かをすることができた後にそれらを置くことによってvaluesに優先順位を付けますObject.assign()で冗長にする:

let sanitized = Object.assign({}, ...Object.keys(schema).map(
    (key) => ({[key]: (key in values ? values : schema)[key]}) 
) 
); 
+0

'const'は最後の例の構文的に正しいでしょうか?あなたが代入を上書きしようとしていないので、それが 'const'が防ぐものです。 – Seth

+0

@Seth OPは、 'sanitized'が定数であるはずだったかどうかを指定しませんでした。 –

+0

しかし最後の例のポイントは、スキーマの割り当てを上書きしないことでした。 「可」は、本質的にその可能性を促進する。 'const'は、設計上、そうではありません。 – Seth

2

他のオブジェクトからキー:

Object.keys(schema).forEach(key => schema[key] = (key in values ? values : schema)[key]); 

あなたは、新しいオブジェクトを作成する場合:また

var newObj = {}; 
Object.keys(schema).forEach(key => newObj[key] = (key in values ? values : schema)[key]); 

を使用すると、矢印の機能を使用しない場合、これは、(同様ESの以前のバージョンと互換性がありますもちろん)。

(key in values ? values : schema)[key])部分は最初のスキーマでそれを実現しない組み込みの方法はありませんundefined

+0

'||'は偽の値で期待通りに動作しません – Bergi

+0

@Bergi right、thanksありがとうございます。私はあなたの答えをすでに更新しているのを見て、同じ方法で同じ方法で更新しています:) – rpadovani

関連する問題

 関連する問題