lodashを使ったオブジェクトのマージ
私はReactをよく使いますが、とにかくオブジェクトのマジをよく使います。
通常、オブジェクトのマージにはObject.assign()やスプレッド演算子を使いますが、1階層しかないオブジェクトならいいのですが、ネストしたオブジェクトは標準機能では容易にマージできない(JSONに一度変換するとかすればできますが)ので、lodashを使ってみます。
準備
npm install --save lodash
実装(テスト)
たまたま開いていたプロジェクトがReact NativeだったのでRN環境で検証しました。
obj1とobj2を作り、
- Object.assign()を利用
- スプレッド演算子を利用
- lodashを利用
の3つを試して結果を表示させています。
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
//lodash
import lodash from 'lodash';
const obj1 = {
status: 'OK',
user: {
email: '[email protected]',
age: 33,
}
}
const obj2 = {
status: 'OK',
user: {
tel: '03-1111-2222',
},
others: 'hoge',
}
const obj3 = {
address: 'Tokyo',
}
const obj4 = Object.assign({}, obj1, obj2);
const obj5 = { ...obj1, ...obj2 };
const obj6 = lodash.merge({},obj1, obj2);
const obj7 = lodash.cloneDeep(obj6);
lodash.merge(obj7.user, obj3); //たりたいこと
export default function App() {
console.log(obj4);
console.log(obj5);
console.log(obj6);
console.log(obj7);
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Open up App.js to start working on your app!</Text>
</View>
);
}
結果と考察
lodash以外は1階層目しかマージされていません。なお、同じ変数名がある場合は、後優先となるようです。
Object {
"others": "hoge",
"status": "OK",
"user": Object {
"tel": "03-1111-2222",
},
}
Object {
"others": "hoge",
"status": "OK",
"user": Object {
"tel": "03-1111-2222",
},
}
Object {
"others": "hoge",
"status": "OK",
"user": Object {
"age": 33,
"email": "[email protected]",
"tel": "03-1111-2222",
},
}
Object {
"others": "hoge",
"status": "OK",
"user": Object {
"address": "Tokyo",
"age": 33,
"email": "[email protected]",
"tel": "03-1111-2222",
},
}
いろいろ使いこなせば便利なんでしょうけど、とりあえずmergeで。
Author And Source
この問題について(lodashを使ったオブジェクトのマージ), 我々は、より多くの情報をここで見つけました https://qiita.com/zaburo/items/3b10d410c264aedd3c94著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .