質問するログイン新規登録

回答編集履歴

1

stackoverflowの回答も参照

2018/12/04 09:48

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -6,5 +6,34 @@
6
6
  const dayEdited = {dayTypeId, nonReservedVisits, reservedVisits, canceledReservations, workStaffIds}
7
7
  ```
8
8
 
9
+ スタフロの質問で似たようなのを見つけました。
10
+ [How to get a subset of a javascript object's properties](https://stackoverflow.com/questions/17781472/how-to-get-a-subset-of-a-javascript-objects-properties)
11
+
12
+ > ```JavaScript
13
+ > const object = { a: 5, b: 6, c: 7 };
14
+ > const picked = (({ a, c }) => ({ a, c }))(object);
15
+ >
16
+ > console.log(picked); // { a: 5, c: 7 }
17
+ > ```
18
+
19
+ 模範解答はこれでまぁそうだよねって感じ、おっと思いましたが結局キー名を2度書くのも同様で微妙です。
20
+ 解答欄でビビっときたのがこれですね。
21
+
22
+ > ```JavaScript
23
+ > var subset = ['color', 'height'].reduce(function(o, k) { o[k] = elmo[k]; return o; > }, {});
24
+ > ```
25
+
26
+ [Array.prototype.reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)は難解ですが、ネイティブのJSでは配列から作れないものがないといったレベルで何でも加工出来ますので、是非覚えましょう。
27
+ これベースで質問文を書き直すとこうなります。
28
+
29
+ ```JavaScript
30
+ const dayEdited = ['dayTypeId', 'nonReservedVisits', 'reservedVisits', 'canceledReservations', 'workStaffIds'].reduce((obj, key) => {
31
+ obj[key] = this.props.day[key];
32
+ return obj;
33
+ }, {})
34
+ ```
35
+
36
+ ---
37
+
9
38
  ライブラリが使えるなら[Ramda.js](https://ramdajs.com/)の[pick](https://ramdajs.com/docs/#pick)かすぐ下にあるpickAllあたりを採用すれば一撃です。
10
39
  [Lodash](https://lodash.com/)にも[pick](https://lodash.com/docs/4.17.11#pick)があるので、何かしらのライブラリを忍ばせておくと何かと便利だと思います。