2017-11-17 9 views
0

でtruthy場合、私は彼らの名前を変更すると、彼らはtruthyである場合にのみ上書きしながら、objBobjAからプロパティを転送します。 lodashを使用してもES6ソリューションを使用する方がより良いでしょう。SetオブジェクトのプロパティのJavascript

これは私がこれまで持っているものです。

// My initial objects 
const objA = {a: 1, b: '', c: null}; 
const objB = {x: 7, y: 8, z: 9}; 

// Extracting and renaming 
let {x: a, y: b, z: c} = obj1; 

// Sanitizing 
const temp = _.pickBy({x, y, z}, _.identity); 

// Merging A and B 
return {...objB, ...objA}; // {x: 1, y: 8, z: 9} 

は、これを行うの少ない不自然な方法はありますか?

+0

ロット正気だろう地図を使用してのように思えます。 – pvg

+0

FWIW、 '{... objB、... objA}'は有効ではありません。オブジェクトスプレッドは提案です。実験的機能を使用した回答を受け入れる場合は、[tag:ecmascript-next]で質問にタグを付ける必要があります。 –

+0

は常に 'objB'をキー' {x、y、z} 'にしますか? – Roman

答えて

1

どちらの解決策でも、配列キーの名前を変更するのにMapを使用し、Object#assignを使用してオブジェクトをマージします(スニペットはオブジェクトの残り/スプレッドをサポートしません)。

ES2017

使用Object#entries(ES2017)、objAのキーと値を取得する値がfalsyでない場合にのみ、それらの名前を変更し、追加します。

const a2x = new Map([['a', 'x'], ['b', 'y'], ['c', 'z']]); 
 

 
const objA = {a: 1, b: '', c: null}; 
 
const objB = {x: 7, y: 8, z: 9}; 
 

 
const result = Object.assign({}, objB, 
 
    Object.entries(objA).reduce((r, [k, v]) => v ? 
 
    Object.assign(r, { [a2x.get(k)]: v }) : r, {})); 
 

 
console.log(result);

lodash:

使用_.mapKeys() falsy値を削除する_.identity()_.pickBy()、その後、キーの名前を変更します。

const a2x = new Map([['a', 'x'], ['b', 'y'], ['c', 'z']]); 
 

 
const objA = {a: 1, b: '', c: null}; 
 
const objB = {x: 7, y: 8, z: 9}; 
 

 
const result = Object.assign({}, objB, 
 
    _.pickBy(_.mapKeys(objA, (v, k) => a2x.get(k)), _.identity)); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

関連する問題