回答編集履歴

7

更新日の修正

2017/07/19 11:07

投稿

think49
think49

スコア18166

test CHANGED
@@ -342,11 +342,11 @@
342
342
 
343
343
 
344
344
 
345
- - 2017/09/19 17:40 「多次元 Map」を追記
345
+ - 2017/07/19 17:40 「多次元 Map」を追記
346
-
346
+
347
- - 2017/09/19 18:14 「2進数のビットマップ」を追記
347
+ - 2017/07/19 18:14 「2進数のビットマップ」を追記
348
-
348
+
349
- - 2017/09/19 18:21 多次元 Map で条件が増えた場合のコードを追記
349
+ - 2017/07/19 18:21 多次元 Map で条件が増えた場合のコードを追記
350
350
 
351
351
 
352
352
 

6

多次元 Map で条件が増えた場合のコードを追記

2017/07/19 11:07

投稿

think49
think49

スコア18166

test CHANGED
@@ -106,8 +106,6 @@
106
106
 
107
107
  配列の代わりに `Map` を使用してみました。
108
108
 
109
- 条件が3列以上になってもキーの配列を増やすだけで対応可能です。
110
-
111
109
 
112
110
 
113
111
  - [multidimensional-map.js : 多次元Mapを生成](https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2)
@@ -242,6 +240,40 @@
242
240
 
243
241
 
244
242
 
243
+ 条件が増えた場合、ルールの数を増やすだけで対応可能です。
244
+
245
+
246
+
247
+ ```JavaScript
248
+
249
+ var rules = [
250
+
251
+ [new Map([['A', false], ['B', false], ['C', false]]), 'XXX'],
252
+
253
+ [new Map([['A', false], ['B', true], ['C', true]]), 'XYY'],
254
+
255
+ [new Map([['A', true], ['B', false], ['C', false]]), 'YXX'],
256
+
257
+ [new Map([['A', true], ['B', true], ['C', true]]), 'YYY']
258
+
259
+ ];
260
+
261
+ var getImportance3 = createFunction(rules);
262
+
263
+
264
+
265
+ console.log(getImportance3({A: false, B: false, C: false})); // "XXX"
266
+
267
+ console.log(getImportance3({A: false, B: true, C: true})); // "XYY"
268
+
269
+ console.log(getImportance3({A: true, B: false, C: false})); // "YXX"
270
+
271
+ console.log(getImportance3({A: true, B: true, C: true})); // "YYY"
272
+
273
+ ```
274
+
275
+
276
+
245
277
  ### 2進数のビットマップ
246
278
 
247
279
 
@@ -314,6 +346,8 @@
314
346
 
315
347
  - 2017/09/19 18:14 「2進数のビットマップ」を追記
316
348
 
349
+ - 2017/09/19 18:21 多次元 Map で条件が増えた場合のコードを追記
350
+
317
351
 
318
352
 
319
353
  Re: ssbb0212 さん

5

多次元 Mapで条件が増えた場合

2017/07/19 09:21

投稿

think49
think49

スコア18166

test CHANGED
@@ -106,6 +106,8 @@
106
106
 
107
107
  配列の代わりに `Map` を使用してみました。
108
108
 
109
+ 条件が3列以上になってもキーの配列を増やすだけで対応可能です。
110
+
109
111
 
110
112
 
111
113
  - [multidimensional-map.js : 多次元Mapを生成](https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2)

4

「2進数のビットマップ」を追記

2017/07/19 09:16

投稿

think49
think49

スコア18166

test CHANGED
@@ -240,12 +240,78 @@
240
240
 
241
241
 
242
242
 
243
+ ### 2進数のビットマップ
244
+
245
+
246
+
247
+ もし、2進数に馴染み深いのであれば、基数変換するのも手です。
248
+
249
+
250
+
251
+ |A|B|C|合計|
252
+
253
+ |:--:|:--:|:--:|:--:|
254
+
255
+ |0|0|0|0|
256
+
257
+ |0|0|1|1|
258
+
259
+ |0|1|0|2|
260
+
261
+ |0|1|1|3|
262
+
263
+ |1|0|0|4|
264
+
265
+ |1|0|1|5|
266
+
267
+ |1|1|0|6|
268
+
269
+
270
+
271
+ 2進数なので2パターンしか対応できませんが、コードは大分シンプルで条件が増えても対応可能です。
272
+
273
+ ただし、条件が増えると左端に "D -> A -> B - > C" になってしまいます。
274
+
275
+ 「C -> B -> A」のように降順で定義しておけば解決しますが、反面、読みづらくなるので、機械的に処理する工夫が必要かもしれません。
276
+
277
+
278
+
279
+ ```JavaScript
280
+
281
+ function getValue (a, b, c) {
282
+
283
+ return ['000','001','010','011','100','101','110'][parseInt('' + Number(c) + Number(b) + Number(a), 2)];
284
+
285
+ }
286
+
287
+
288
+
289
+ console.log(getValue(false, false, false)); // "000"
290
+
291
+ console.log(getValue(false, false, true)); // "001"
292
+
293
+ console.log(getValue(false, true, false)); // "010"
294
+
295
+ console.log(getValue(false, true, true)); // "011"
296
+
297
+ console.log(getValue(true, false, false)); // "100"
298
+
299
+ console.log(getValue(true, false, true)); // "101"
300
+
301
+ console.log(getValue(true, true, false)); // "110"
302
+
303
+ ```
304
+
305
+
306
+
243
307
  ### 更新履歴
244
308
 
245
309
 
246
310
 
247
311
  - 2017/09/19 17:40 「多次元 Map」を追記
248
312
 
313
+ - 2017/09/19 18:14 「2進数のビットマップ」を追記
314
+
249
315
 
250
316
 
251
317
  Re: ssbb0212 さん

3

「多次元 Map」を追記

2017/07/19 09:14

投稿

think49
think49

スコア18166

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- ### 二次元配列 (設定の可読性を向上させたもの)
39
+ ### 二次元配列 + オブジェクト初期化子
40
40
 
41
41
 
42
42
 
@@ -100,4 +100,152 @@
100
100
 
101
101
 
102
102
 
103
+ ### 多次元 Map
104
+
105
+
106
+
107
+ 配列の代わりに `Map` を使用してみました。
108
+
109
+
110
+
111
+ - [multidimensional-map.js : 多次元Mapを生成](https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2)
112
+
113
+ - [多次元 Map - JSFiddle](https://jsfiddle.net/cj7vsttf/1/)
114
+
115
+
116
+
117
+ ```JavaScript
118
+
119
+ var map = createMultidimensionalMap([
120
+
121
+ [[false, false], '低い'],
122
+
123
+ [[false, true], '普通'],
124
+
125
+ [[true, false], 'やや高い'],
126
+
127
+ [[true, true], '高い']
128
+
129
+ ]);
130
+
131
+
132
+
133
+ console.log(map);
134
+
135
+ console.log(map.get(false).get(false)); // "低い"
136
+
137
+ console.log(map.get(false).get(true)); // "普通"
138
+
139
+ console.log(map.get(true).get(false)); // "やや高い"
140
+
141
+ console.log(map.get(true).get(true)); // "高い"
142
+
143
+ ```
144
+
145
+
146
+
147
+ 以下、オブジェクト初期化子でルールを渡せるようにしたコード。
148
+
149
+
150
+
151
+ - [多次元 Map で重要度を定義する - JSFiddle](https://jsfiddle.net/cj7vsttf/2/)
152
+
153
+
154
+
155
+ ```JavaScript
156
+
157
+ 'use strict';
158
+
159
+ function createFunction (rules) {
160
+
161
+ var keys = [...rules[0][0].keys()],
162
+
163
+ hasOwnProperty = Object.prototype.hasOwnProperty;
164
+
165
+
166
+
167
+ for (var i = 0, len = rules.length, rule; i < len; ++i) {
168
+
169
+ rule = rules[i];
170
+
171
+ rule[0] = [...rule[0].values()];
172
+
173
+ }
174
+
175
+
176
+
177
+ rules = createMultidimensionalMap(rules);
178
+
179
+
180
+
181
+ return function getImportance3 (conditions) {
182
+
183
+ var map = rules;
184
+
185
+
186
+
187
+ for (var i = 0, len = keys.length, key; i < len; ++i) {
188
+
189
+ key = keys[i];
190
+
191
+
192
+
193
+ if (!hasOwnProperty.call(conditions, key)) {
194
+
195
+ throw new ReferenceError;
196
+
197
+ }
198
+
199
+
200
+
201
+ map = map.get(conditions[key]);
202
+
203
+ }
204
+
205
+
206
+
207
+ return map;
208
+
209
+ };
210
+
211
+ }
212
+
213
+
214
+
215
+ var rules = [
216
+
217
+ [new Map([['A', false], ['B', false]]), '低い'],
218
+
219
+ [new Map([['A', false], ['B', true]]), '普通'],
220
+
221
+ [new Map([['A', true], ['B', false]]), 'やや高い'],
222
+
223
+ [new Map([['A', true], ['B', true]]), '高い']
224
+
225
+ ];
226
+
227
+ var getImportance3 = createFunction(rules);
228
+
229
+
230
+
231
+ console.log(getImportance3({A: false, B: false})); // "低い"
232
+
233
+ console.log(getImportance3({A: false, B: true})); // "普通"
234
+
235
+ console.log(getImportance3({A: true, B: false})); // "やや高い"
236
+
237
+ console.log(getImportance3({A: true, B: true})); // "高い"
238
+
239
+ ```
240
+
241
+
242
+
243
+ ### 更新履歴
244
+
245
+
246
+
247
+ - 2017/09/19 17:40 「多次元 Map」を追記
248
+
249
+
250
+
103
251
  Re: ssbb0212 さん

2

デバッグ用途の console\.log を削除

2017/07/19 08:40

投稿

think49
think49

スコア18166

test CHANGED
@@ -80,8 +80,6 @@
80
80
 
81
81
  return function getImportance2 (a, b) {
82
82
 
83
- console.log(JSON.stringify(array));
84
-
85
83
  return array[Number(Boolean(a))][Number(Boolean(b))];
86
84
 
87
85
  };

1

二次元配列 \(設定の可読性を向上させたもの\)

2017/07/19 04:04

投稿

think49
think49

スコア18166

test CHANGED
@@ -1,4 +1,8 @@
1
1
  JavaScript で回答します。
2
+
3
+
4
+
5
+ ### 二次元配列
2
6
 
3
7
 
4
8
 
@@ -10,7 +14,9 @@
10
14
 
11
15
  ```JavaScript
12
16
 
17
+ 'use strict';
18
+
13
- function getImportance (a, b) { // 仮引数 a, b は Boolean 型の値をとるものとする
19
+ function getImportance1 (a, b) { // 仮引数 a, b は Boolean 型の値をとるものとする
14
20
 
15
21
  return [['低い', '普通'], ['やや高い', '高い']][Number(Boolean(a))][Number(Boolean(b))];
16
22
 
@@ -18,13 +24,79 @@
18
24
 
19
25
 
20
26
 
21
- console.log(getImportance(false, false)); // "低い"
27
+ console.log(getImportance1(false, false)); // "低い"
22
28
 
23
- console.log(getImportance(false, true)); // "普通"
29
+ console.log(getImportance1(false, true)); // "普通"
24
30
 
25
- console.log(getImportance(true, false)); // "やや高い"
31
+ console.log(getImportance1(true, false)); // "やや高い"
26
32
 
27
- console.log(getImportance(true, true)); // "高い"
33
+ console.log(getImportance1(true, true)); // "高い"
34
+
35
+ ```
36
+
37
+
38
+
39
+ ### 二次元配列 (設定の可読性を向上させたもの)
40
+
41
+
42
+
43
+ 設定の可読性とパフォーマンスの両立を目指しました。
44
+
45
+
46
+
47
+ ```JavaScript
48
+
49
+ 'use strict';
50
+
51
+ var getImportance2 = (function () {
52
+
53
+ var rules = [
54
+
55
+ [{a: false, b: false}, '低い'],
56
+
57
+ [{a: false, b: true}, '普通'],
58
+
59
+ [{a: true, b: false}, 'やや高い'],
60
+
61
+ [{a: true, b: true}, '高い']
62
+
63
+ ],
64
+
65
+ array = [[],[]];
66
+
67
+
68
+
69
+ for (var i = 0, len = rules.length, rule; i < len; ++i) {
70
+
71
+ rule = rules[i];
72
+
73
+
74
+
75
+ array[Number(rule[0].a)][Number(rule[0].b)] = rule[1];
76
+
77
+ }
78
+
79
+
80
+
81
+ return function getImportance2 (a, b) {
82
+
83
+ console.log(JSON.stringify(array));
84
+
85
+ return array[Number(Boolean(a))][Number(Boolean(b))];
86
+
87
+ };
88
+
89
+ }());
90
+
91
+
92
+
93
+ console.log(getImportance2(false, false)); // "低い"
94
+
95
+ console.log(getImportance2(false, true)); // "普通"
96
+
97
+ console.log(getImportance2(true, false)); // "やや高い"
98
+
99
+ console.log(getImportance2(true, true)); // "高い"
28
100
 
29
101
  ```
30
102