回答編集履歴

31

テキスト修正

2019/01/03 03:23

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -338,7 +338,7 @@
338
338
 
339
339
  ```
340
340
 
341
- - **動作確認用サンプル(6):** [https://jsfiddle.net/jun68ykt/b5fs6rou/1/](https://jsfiddle.net/jun68ykt/b5fs6rou/1/)
341
+ - **動作確認用サンプル(6):** [https://jsfiddle.net/jun68ykt/b5fs6rou/2/](https://jsfiddle.net/jun68ykt/b5fs6rou/2/)
342
342
 
343
343
 
344
344
 

30

テキスト修正

2019/01/03 03:23

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -388,7 +388,7 @@
388
388
 
389
389
 
390
390
 
391
- - **動作確認用サンプル(7):** [https://jsfiddle.net/jun68ykt/jfahcL1e/20/](https://jsfiddle.net/jun68ykt/jfahcL1e/20/)
391
+ - **動作確認用サンプル(7):** [https://jsfiddle.net/jun68ykt/jfahcL1e/22/](https://jsfiddle.net/jun68ykt/jfahcL1e/22/)
392
392
 
393
393
 
394
394
 

29

テキスト修正

2019/01/03 03:22

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -346,7 +346,7 @@
346
346
 
347
347
 
348
348
 
349
- ここまでの回答では、`forEach`, `map`, `filter` および `Map` などを使用しましたが、ご質問に挙げられている `name_mail` と `name_data` に対する、二重のforループのコードを少し修正して、ご希望の出力を得ようとするならば、例えば以下のようにすればよいかと思います。
349
+ ここまでの回答では、`forEach`, `map`, `filter` および `Map` などを使用しましたが、ご質問に挙げられている二重のforループのコードを少し修正して、ご希望の出力を得ようとするならば、例えば以下のようにすればよいかと思います。
350
350
 
351
351
 
352
352
 

28

テキスト修正

2019/01/03 02:47

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -362,7 +362,7 @@
362
362
 
363
363
  let matched = false;
364
364
 
365
- for( let j=0; j < 3; j ++ ) {
365
+ for(let j=0; j < 3; j ++ ) {
366
366
 
367
367
  if (name_mail[i] == name_data[j][0]) {
368
368
 
@@ -388,7 +388,7 @@
388
388
 
389
389
 
390
390
 
391
- - **動作確認用サンプル(7):** [https://jsfiddle.net/jun68ykt/jfahcL1e/19/](https://jsfiddle.net/jun68ykt/jfahcL1e/19/)
391
+ - **動作確認用サンプル(7):** [https://jsfiddle.net/jun68ykt/jfahcL1e/20/](https://jsfiddle.net/jun68ykt/jfahcL1e/20/)
392
392
 
393
393
 
394
394
 
@@ -396,6 +396,6 @@
396
396
 
397
397
 
398
398
 
399
- - `0不明` の出力は、内側のループ、`for( let j=0; j < 3; j ++ ) {・・・}` から抜けてから行う。
399
+ - `0不明` の出力は、内側のループ、`for(let j=0; j < 3; j ++ ) {・・・}` から抜けてから行う。
400
400
 
401
401
  - 内側のループで値が見つかったのか否かの結果を、ループから抜けた後に参照できるようにする。(上記のコードではそのために、`matched` というフラグを追加)

27

テキスト修正

2019/01/03 02:27

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- ### 追記
59
+ ### 追記1
60
60
 
61
61
 
62
62
 
@@ -339,3 +339,63 @@
339
339
  ```
340
340
 
341
341
  - **動作確認用サンプル(6):** [https://jsfiddle.net/jun68ykt/b5fs6rou/1/](https://jsfiddle.net/jun68ykt/b5fs6rou/1/)
342
+
343
+
344
+
345
+ ### 追記3
346
+
347
+
348
+
349
+ ここまでの回答では、`forEach`, `map`, `filter` および `Map` などを使用しましたが、ご質問に挙げられている `name_mail` と `name_data` に対する、二重のforループのコードを少し修正して、ご希望の出力を得ようとするならば、例えば以下のようにすればよいかと思います。
350
+
351
+
352
+
353
+ ```javascript
354
+
355
+ const name_mail = [["鈴木"], ["田中"], ["佐藤"], ["池田"], ["小林"], ["村田"], ["中野"], ["山田"], ["村西"], ["坂本"]];
356
+
357
+ const name_data = [["鈴木", 1], ["田中", 2], ["池田", 3]];
358
+
359
+
360
+
361
+ for(let i=0; i < 11; i ++ ) {
362
+
363
+ let matched = false;
364
+
365
+ for( let j=0; j < 3; j ++ ) {
366
+
367
+ if (name_mail[i] == name_data[j][0]) {
368
+
369
+ matched = true;
370
+
371
+ console.log(`${name_data[j][1]}${name_data[j][0]}`);
372
+
373
+ break;
374
+
375
+ }
376
+
377
+ }
378
+
379
+ if (!matched) {
380
+
381
+ console.log('0不明');
382
+
383
+ }
384
+
385
+ }
386
+
387
+ ```
388
+
389
+
390
+
391
+ - **動作確認用サンプル(7):** [https://jsfiddle.net/jun68ykt/jfahcL1e/19/](https://jsfiddle.net/jun68ykt/jfahcL1e/19/)
392
+
393
+
394
+
395
+ 修正の要点は以下の2点です。
396
+
397
+
398
+
399
+ - `0不明` の出力は、内側のループ、`for( let j=0; j < 3; j ++ ) {・・・}` から抜けてから行う。
400
+
401
+ - 内側のループで値が見つかったのか否かの結果を、ループから抜けた後に参照できるようにする。(上記のコードではそのために、`matched` というフラグを追加)

26

テキスト修正

2019/01/03 02:12

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -272,13 +272,13 @@
272
272
 
273
273
 
274
274
 
275
- 具体的には、以下の条件
275
+ 具体的には、以下の2条件
276
-
277
-
278
-
276
+
277
+
278
+
279
- - `name_mail` に含まれる名前の全てをキーとして持っている
279
+ - `name_mail` または `name_data` 、あるいは両方に含まれる名前(人名姓)の全てをキーとして持
280
-
280
+
281
- - 各キーに対する値としては、デフォルト値は 0 で、`name_data` に格納さていれば、その値とする。
281
+ - 各キーに対する値としては、デフォルト値は 0 で、`name_data` に同じキーのエントリれば、その値とする。
282
282
 
283
283
 
284
284
 

25

テキスト修正

2019/01/02 23:51

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -268,7 +268,11 @@
268
268
 
269
269
 
270
270
 
271
- 補足す。別案として、以下ようなMapオブジェクトを作る方法を挙げます。
271
+ ここまに示した回答では、配列 `name_data` からMapを作っていましたが、 別案として、`name_mail` と`name_data` 両方の配列が持つ内容をマージしたエントリを含むMapを作る方法を挙げます。
272
+
273
+
274
+
275
+ 具体的には、以下の条件
272
276
 
273
277
 
274
278
 
@@ -278,7 +282,7 @@
278
282
 
279
283
 
280
284
 
281
- 上記を満たす Map `name_data_map` を
285
+ を満たすMapオブジェクトを
282
286
 
283
287
  ```
284
288
 
@@ -288,7 +292,9 @@
288
292
 
289
293
 
290
294
 
295
+ で作成できます。
296
+
291
- で作成できます。は以下のような内容を持つMapオブジェクトになります。
297
+ の `name_data_map` は以下のような内容を持つMapオブジェクトになります。
292
298
 
293
299
  ```
294
300
 

24

テキスト修正

2019/01/02 23:44

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -288,7 +288,7 @@
288
288
 
289
289
 
290
290
 
291
- で作成ます。これは以下のような内容を持つMapオブジェクトになります。
291
+ で作成できます。これは以下のような内容を持つMapオブジェクトになります。
292
292
 
293
293
  ```
294
294
 

23

テキスト修正

2019/01/02 03:21

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -318,7 +318,7 @@
318
318
 
319
319
 
320
320
 
321
- これ使って、各エントリをご要望の形式で出力するには以下のようにします。(**※ソート処理は加えていません。**)
321
+ これ使って、各エントリをご要望の形式で出力するには以下のようにします。(**※ソート処理は加えていません。**)
322
322
 
323
323
 
324
324
 

22

テキスト修正

2019/01/01 23:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -278,7 +278,7 @@
278
278
 
279
279
 
280
280
 
281
- 上記を満たす `name_data_map`
281
+ 上記を満たす Map 、`name_data_map`
282
282
 
283
283
  ```
284
284
 
@@ -288,7 +288,7 @@
288
288
 
289
289
 
290
290
 
291
- で作とができ、以下のような内容を持つMapオブジェクトになります。
291
+ で作成します。れは以下のような内容を持つMapオブジェクトになります。
292
292
 
293
293
  ```
294
294
 

21

テキスト修正

2019/01/01 10:56

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -268,7 +268,7 @@
268
268
 
269
269
 
270
270
 
271
- 補足です。別案として、以下のようなMapオブジェクトを作る方法を挙げます。(**※ソート処理は加えていません。**)
271
+ 補足です。別案として、以下のようなMapオブジェクトを作る方法を挙げます。
272
272
 
273
273
 
274
274
 
@@ -318,7 +318,7 @@
318
318
 
319
319
 
320
320
 
321
- これ使って、各エントリをご要望の形式で出力するには以下のようにします。
321
+ これ使って、各エントリをご要望の形式で出力するには以下のようにします。(**※ソート処理は加えていません。**)
322
322
 
323
323
 
324
324
 

20

テキスト修正

2019/01/01 07:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -268,7 +268,7 @@
268
268
 
269
269
 
270
270
 
271
- 補足です。別案として、以下のようなMapオブジェクトを作る方法を挙げます。(ソート処理は加えていません。)
271
+ 補足です。別案として、以下のようなMapオブジェクトを作る方法を挙げます。(**※ソート処理は加えていません。**
272
272
 
273
273
 
274
274
 
@@ -318,7 +318,7 @@
318
318
 
319
319
 
320
320
 
321
- これを以下のようにして表示させます。
321
+ これ使って、各エントリご要望の形式で出力するには以下のようにします。
322
322
 
323
323
 
324
324
 

19

テキスト修正

2019/01/01 07:26

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -268,56 +268,68 @@
268
268
 
269
269
 
270
270
 
271
- 補足です。
271
+ 補足です。別案として、以下のようなMapオブジェクトを作る方法を挙げます。(ソート処理は加えていません。)
272
-
272
+
273
+
274
+
273
- 出力の順番こだわらないであればですが、以下はどうでょう?
275
+ - `name_mail` 含まれる名前全てをキーとて持っている。
276
+
274
-
277
+ - 各キーに対する値としては、デフォルト値は 0 で、`name_data` に値が格納されていれば、その値とする。
278
+
279
+
280
+
275
-
281
+ 上記を満たす `name_data_map` は
276
-
282
+
277
- ```
283
+ ```
284
+
278
-
285
+ const name_data_map = new Map([...name_mail.map(e => [e[0], 0]), ...name_data]);
286
+
287
+ ```
288
+
289
+
290
+
291
+ で作ることができ、以下のような内容を持つMapオブジェクトになります。
292
+
293
+ ```
294
+
295
+ Map {
296
+
297
+ '鈴木' => 1,
298
+
299
+ '田中' => 2,
300
+
301
+ '佐藤' => 0,
302
+
303
+ '池田' => 3,
304
+
305
+ '小林' => 0,
306
+
307
+ '村田' => 0,
308
+
309
+ '中野' => 0,
310
+
311
+ '山田' => 0,
312
+
313
+ '村西' => 0,
314
+
315
+ '坂本' => 0 }
316
+
317
+ ```
318
+
319
+
320
+
321
+ これを以下のようにして表示させます。
322
+
323
+
324
+
325
+ ```
326
+
279
- new Map([...name_mail, ...name_data]).forEach(
327
+ name_data_map.forEach(
280
-
328
+
281
- (data, name) => console.log(`${data || 0}${data ? name : '不明'}`)
329
+ (data, name) => console.log(`${data}${data ? name : '不明'}`)
282
330
 
283
331
  );
284
332
 
285
333
  ```
286
334
 
287
- - **動作確認用サンプル(6):** [https://jsfiddle.net/jun68ykt/5xm4veyk/6/](https://jsfiddle.net/jun68ykt/5xm4veyk/6/)
335
+ - **動作確認用サンプル(6):** [https://jsfiddle.net/jun68ykt/b5fs6rou/1/](https://jsfiddle.net/jun68ykt/b5fs6rou/1/)
288
-
289
-
290
-
291
- 上記は、(値が undefined のエントリを意図的に追加するということをやっているので、ちょっとトリッキーかもしれませんが、) `new Map([...name_mail, ...name_data])` によって、以下
292
-
293
-
294
-
295
- ```
296
-
297
- Map {
298
-
299
- '鈴木' => 1,
300
-
301
- '田中' => 2,
302
-
303
- '佐藤' => undefined,
304
-
305
- '池田' => 3,
306
-
307
- '小林' => undefined,
308
-
309
- '村田' => undefined,
310
-
311
- '中野' => undefined,
312
-
313
- '山田' => undefined,
314
-
315
- '村西' => undefined,
316
-
317
- '坂本' => undefined }
318
-
319
- ```
320
-
321
-
322
-
323
- のような内容のMapオブジェクトが作られることを利用しています。

18

テキスト修正

2019/01/01 00:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -261,3 +261,63 @@
261
261
  ```
262
262
 
263
263
  - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/73/](https://jsfiddle.net/jun68ykt/rjeh3gbv/73/)
264
+
265
+
266
+
267
+ ### 追記2
268
+
269
+
270
+
271
+ 補足です。
272
+
273
+ 出力の順番にこだわらないのであればですが、以下はどうでしょう?
274
+
275
+
276
+
277
+ ```
278
+
279
+ new Map([...name_mail, ...name_data]).forEach(
280
+
281
+ (data, name) => console.log(`${data || 0}${data ? name : '不明'}`)
282
+
283
+ );
284
+
285
+ ```
286
+
287
+ - **動作確認用サンプル(6):** [https://jsfiddle.net/jun68ykt/5xm4veyk/6/](https://jsfiddle.net/jun68ykt/5xm4veyk/6/)
288
+
289
+
290
+
291
+ 上記は、(値が undefined のエントリを意図的に追加するということをやっているので、ちょっとトリッキーかもしれませんが、) `new Map([...name_mail, ...name_data])` によって、以下
292
+
293
+
294
+
295
+ ```
296
+
297
+ Map {
298
+
299
+ '鈴木' => 1,
300
+
301
+ '田中' => 2,
302
+
303
+ '佐藤' => undefined,
304
+
305
+ '池田' => 3,
306
+
307
+ '小林' => undefined,
308
+
309
+ '村田' => undefined,
310
+
311
+ '中野' => undefined,
312
+
313
+ '山田' => undefined,
314
+
315
+ '村西' => undefined,
316
+
317
+ '坂本' => undefined }
318
+
319
+ ```
320
+
321
+
322
+
323
+ のような内容のMapオブジェクトが作られることを利用しています。

17

テキスト修正

2018/12/31 09:59

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
 
86
86
 
87
- のようにするか、もしくは、shou6 さんがコメントでフォローして下さっているように ` if (map.has(name)) ` に対する `else` を追加して、以下
87
+ のようにするか、もしくは、shou6 さんがコメントでフォローして下さっているように、[動作確認用サンプル(1)](https://jsfiddle.net/jun68ykt/rjeh3gbv/21/) のコードの ` if (map.has(name)) ` に対する `else` を追加して、以下
88
88
 
89
89
 
90
90
 
@@ -140,7 +140,7 @@
140
140
 
141
141
 
142
142
 
143
- もし、上記では望ましくなく
143
+ 上記のように、 `2田中` と `3池田` との間に、1個の `0不明` が出力されますが、もし、これが望んいる出力ではなく、
144
144
 
145
145
 
146
146
 
@@ -176,7 +176,7 @@
176
176
 
177
177
 
178
178
 
179
- という順出力させたいのであれば、どこかで [sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う必要があり、もう一工夫が必要ですね。一例として、以下のようにしてみました。
179
+ という順序を保って出力させたいのであれば、どこかで [sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う必要があり、もう一工夫が必要ですね。一例として、以下のようにしてみました。
180
180
 
181
181
 
182
182
 

16

テキスト修正

2018/12/31 08:09

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
 
62
62
 
63
- `name_data` に該当する要素がないものについは、 `0不明` を出力するには、以下
63
+ `name_data` に該当する要素がないものに対して `0不明` を出力させるようにするには、例えば以下
64
64
 
65
65
 
66
66
 

15

テキスト修正

2018/12/31 07:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -230,7 +230,7 @@
230
230
 
231
231
 
232
232
 
233
- とはいえ上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避する、ソートキーとなるプロパティを別に追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れることにしました。それが以下です。
233
+ とはいえ上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合しておりやや回りくどいですね。これを回避するため、ソートキーとなるプロパティを別に追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れることにしました。それが以下です。
234
234
 
235
235
 
236
236
 

14

テキスト修正

2018/12/31 07:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -236,15 +236,13 @@
236
236
 
237
237
  ```javascript
238
238
 
239
- const names = name_mail.map(([name]) => name);
240
-
241
239
  const m = new Map(name_data);
242
240
 
243
241
 
244
242
 
245
- names
243
+ name_mail
246
-
244
+
247
- .map(name => ({
245
+ .map(([name]) => ({
248
246
 
249
247
  name: m.has(name) ? name : '不明',
250
248
 
@@ -258,6 +256,8 @@
258
256
 
259
257
  .forEach(e => console.log(`${e.data}${e.name}`));
260
258
 
259
+
260
+
261
- ```
261
+ ```
262
-
262
+
263
- - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/71/](https://jsfiddle.net/jun68ykt/rjeh3gbv/71/)
263
+ - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/73/](https://jsfiddle.net/jun68ykt/rjeh3gbv/73/)

13

テキスト修正

2018/12/31 07:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -212,19 +212,11 @@
212
212
 
213
213
 
214
214
 
215
- 上記のコードを動作確認するためのサンプルを、以下
216
-
217
-
218
-
219
215
  - **動作確認用サンプル(4):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/50/](https://jsfiddle.net/jun68ykt/rjeh3gbv/50/)
220
216
 
221
217
 
222
218
 
223
- に作成しました。
224
-
225
-
226
-
227
- なお、上記サンプル(4)では、正しく動作するかの検証のために、最初に与えられた2つの配列
219
+ なお、上記の[サンプル(4)](https://jsfiddle.net/jun68ykt/rjeh3gbv/50/)では、正しく動作するかの検証のために、最初に与えられた2つの配列
228
220
 
229
221
  - `name_mail`
230
222
 
@@ -238,7 +230,7 @@
238
230
 
239
231
 
240
232
 
241
- もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するに、ソートキーとなるプロパティを別に追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れま。それが以下です。
233
+ とはいえ上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するに、ソートキーとなるプロパティを別に追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れることにしした。それが以下です。
242
234
 
243
235
 
244
236
 

12

テキスト修正

2018/12/31 07:17

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -176,11 +176,7 @@
176
176
 
177
177
 
178
178
 
179
- という順で出力させたいのであれば、もう一工夫が必要ですね。
179
+ という順で出力させたいのであれば、どこかで [sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う必要があり、もう一工夫が必要ですね。一例として、以下のようにしてみました。
180
-
181
-
182
-
183
- 一例として、以下のようにしてみました。
184
180
 
185
181
 
186
182
 

11

テキスト修正

2018/12/31 05:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -242,7 +242,7 @@
242
242
 
243
243
 
244
244
 
245
- もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するには、ソートキーとなるプロパティを追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れます。それが以下です。
245
+ もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するには、ソートキーとなるプロパティを別に追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れます。それが以下です。
246
246
 
247
247
 
248
248
 

10

テキスト修正

2018/12/31 04:08

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -168,11 +168,11 @@
168
168
 
169
169
  のように、
170
170
 
171
- - name_data に該当の要素があるもの結果の先頭にあり
171
+ - name_data に該当の要素があるものは、出力結果の先頭に連続して出力され
172
172
 
173
173
  - かつ、それらはname_data に含まれる数値の昇順に並んでおり、
174
174
 
175
- - その後に該当なしのものが並ぶ
175
+ - その後に該当なしのものに対応する、`0不明` 出力される。
176
176
 
177
177
 
178
178
 

9

テキスト修正

2018/12/31 04:03

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -242,7 +242,7 @@
242
242
 
243
243
 
244
244
 
245
- もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するには、ソートキーとなる order というプロパティを追加して、該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れます。それが以下です。
245
+ もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するには、ソートキーとなるプロパティを追加して、name_dataから作ったマップに該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れます。それが以下です。
246
246
 
247
247
 
248
248
 

8

テキスト修正

2018/12/31 03:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
File without changes

7

テキスト修正

2018/12/31 00:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -260,7 +260,7 @@
260
260
 
261
261
  name: m.has(name) ? name : '不明',
262
262
 
263
- value: m.get(name) || 0,
263
+ data: m.get(name) || 0,
264
264
 
265
265
  order: m.get(name) || Number.MAX_SAFE_INTEGER
266
266
 
@@ -268,8 +268,8 @@
268
268
 
269
269
  .sort((e1,e2) => e1.order - e2.order)
270
270
 
271
- .forEach(e => console.log(`${e.value}${e.name}`));
271
+ .forEach(e => console.log(`${e.data}${e.name}`));
272
-
272
+
273
- ```
273
+ ```
274
-
274
+
275
- - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/70/](https://jsfiddle.net/jun68ykt/rjeh3gbv/70/)
275
+ - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/71/](https://jsfiddle.net/jun68ykt/rjeh3gbv/71/)

6

テキスト修正

2018/12/31 00:16

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -166,7 +166,17 @@
166
166
 
167
167
 
168
168
 
169
+ のように、
170
+
171
+ - name_data に該当の要素があるものが結果の先頭にあり、
172
+
169
- のように、name_data に該当の要素があるものが結果の先頭にあり、かつ、それらはname_data に含まれる数値の昇順に並んでおり、その後に該当なしのものが並ぶ、という順で出力させたいのであれば、もう一工夫が必要ですね。
173
+ - かつ、それらはname_data に含まれる数値の昇順に並んでおり、
174
+
175
+ - その後に該当なしのものが並ぶ
176
+
177
+
178
+
179
+ という順で出力させたいのであれば、もう一工夫が必要ですね。
170
180
 
171
181
 
172
182
 
@@ -232,9 +242,7 @@
232
242
 
233
243
 
234
244
 
235
- もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。なので、ソートキーとなる order というプロパティを追加して、該当なしの場合、昇順でソートした時に後ろにくるように大きな値を入れることにしした
245
+ もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。これを回避するには、ソートキーとなる order というプロパティを追加して、該当なしの場合、昇順でソートした時に後ろにくるように非常に大きな値を入れまそれが以下です。
236
-
237
- それが以下です。
238
246
 
239
247
 
240
248
 
@@ -248,7 +256,15 @@
248
256
 
249
257
  names
250
258
 
259
+ .map(name => ({
260
+
261
+ name: m.has(name) ? name : '不明',
262
+
263
+ value: m.get(name) || 0,
264
+
251
- .map(name => ({ name, value: m.get(name) || 0, order: m.get(name) || Number.MAX_SAFE_INTEGER }))
265
+ order: m.get(name) || Number.MAX_SAFE_INTEGER
266
+
267
+ }))
252
268
 
253
269
  .sort((e1,e2) => e1.order - e2.order)
254
270
 
@@ -256,4 +272,4 @@
256
272
 
257
273
  ```
258
274
 
259
- - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/66/](https://jsfiddle.net/jun68ykt/rjeh3gbv/66/)
275
+ - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/70/](https://jsfiddle.net/jun68ykt/rjeh3gbv/70/)

5

テキスト修正

2018/12/31 00:13

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -232,15 +232,13 @@
232
232
 
233
233
 
234
234
 
235
- もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。なので、該当なしの場合の数値としては、昇順ソート後ろにくるように非常に大き値を入れておき、出力時に 0 で出力するという細工をてみそれが以下です。
235
+ もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。なので、ソートキーとなる order というプロパティを追加して、該当なしの場合、昇順ソートした時に後ろにくるように大き値を入れるしました
236
+
236
-
237
+ それが以下です。
237
-
238
-
238
+
239
+
240
+
239
- ```javascript
241
+ ```javascript
240
-
241
- const DEFAULT_ELEMENT = { name: '不明', value: 0 };
242
-
243
-
244
242
 
245
243
  const names = name_mail.map(([name]) => name);
246
244
 
@@ -250,18 +248,12 @@
250
248
 
251
249
  names
252
250
 
253
- .map(name => ({ name, value: m.get(name) || Number.MAX_SAFE_INTEGER }))
251
+ .map(name => ({ name, value: m.get(name) || 0, order: m.get(name) || Number.MAX_SAFE_INTEGER }))
254
-
252
+
255
- .sort((e1,e2) => e1.value - e2.value)
253
+ .sort((e1,e2) => e1.order - e2.order)
256
-
257
- .forEach(e => {
254
+
258
-
259
- const { name, value } = e.value < Number.MAX_SAFE_INTEGER ? e : DEFAULT_ELEMENT;
260
-
261
- console.log(`${value}${name}`);
255
+ .forEach(e => console.log(`${e.value}${e.name}`));
262
-
263
- });
256
+
264
-
265
- ```
257
+ ```
266
-
258
+
267
- - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/62/](https://jsfiddle.net/jun68ykt/rjeh3gbv/62/)
259
+ - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/66/](https://jsfiddle.net/jun68ykt/rjeh3gbv/66/)

4

テキスト修正

2018/12/31 00:06

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -232,7 +232,7 @@
232
232
 
233
233
 
234
234
 
235
- もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。なので、該当なしの場合の数値として非常に大きい値を入れておき、出力時に 0 で出力するという細工をしてみます。それが以下です。
235
+ もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。なので、該当なしの場合の数値としては、昇順ソートで後ろにくるように非常に大きい値を入れておき、出力時に 0 で出力するという細工をしてみます。それが以下です。
236
236
 
237
237
 
238
238
 

3

テキスト修正

2018/12/30 23:56

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -44,12 +44,224 @@
44
44
 
45
45
 
46
46
 
47
- 以下は、上記のコードを作確認するために jsFiddle に上げたものです。
47
+ 以下は、上記のコードを作確認するために jsFiddle に上げたものです。
48
-
49
-
50
-
48
+
49
+
50
+
51
- - [https://jsfiddle.net/jun68ykt/rjeh3gbv/21/](https://jsfiddle.net/jun68ykt/rjeh3gbv/21/)
51
+ - **動作確認用サンプル(1):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/21/](https://jsfiddle.net/jun68ykt/rjeh3gbv/21/)
52
52
 
53
53
 
54
54
 
55
55
  以上参考になれば幸いです。
56
+
57
+
58
+
59
+ ### 追記
60
+
61
+
62
+
63
+ `name_data` に該当する要素がないものについては、 `0不明` を出力するには、以下
64
+
65
+
66
+
67
+ ```javascript
68
+
69
+ name_mail.forEach(([name]) => {
70
+
71
+ const value = map.get(name) || 0;
72
+
73
+ const label = value ? name : '不明';
74
+
75
+ console.log(`${value}${label}`);
76
+
77
+ });
78
+
79
+ ```
80
+
81
+
82
+
83
+ - **動作確認用サンプル(2):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/30/](https://jsfiddle.net/jun68ykt/rjeh3gbv/30/)
84
+
85
+
86
+
87
+ のようにするか、もしくは、shou6 さんがコメントでフォローして下さっているように ` if (map.has(name)) ` に対する `else` を追加して、以下
88
+
89
+
90
+
91
+ ```javascript
92
+
93
+ name_mail.forEach(([name]) => {
94
+
95
+ if (map.has(name)) {
96
+
97
+ console.log(`${map.get(name)}${name}`);
98
+
99
+ } else {
100
+
101
+ console.log('0不明');
102
+
103
+ }
104
+
105
+ });
106
+
107
+ ```
108
+
109
+ - **動作確認用サンプル(3):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/33/](https://jsfiddle.net/jun68ykt/rjeh3gbv/33/)
110
+
111
+
112
+
113
+ のようにすればよいかと思います。
114
+
115
+
116
+
117
+ ただし上記のサンプル(2)または(3)だと、出力結果は、以下になります。
118
+
119
+
120
+
121
+ > 1鈴木
122
+
123
+ 2田中
124
+
125
+ 0不明
126
+
127
+ 3池田
128
+
129
+ 0不明
130
+
131
+ 0不明
132
+
133
+ 0不明
134
+
135
+ 0不明
136
+
137
+ 0不明
138
+
139
+ 0不明
140
+
141
+
142
+
143
+ もし、上記では望ましくなくて、
144
+
145
+
146
+
147
+ > 1鈴木
148
+
149
+ 2田中
150
+
151
+ 3池田
152
+
153
+ 0不明
154
+
155
+ 0不明
156
+
157
+ 0不明
158
+
159
+ 0不明
160
+
161
+ 0不明
162
+
163
+ 0不明
164
+
165
+ 0不明
166
+
167
+
168
+
169
+ のように、name_data に該当の要素があるものが結果の先頭にあり、かつ、それらはname_data に含まれる数値の昇順に並んでおり、その後に該当なしのものが並ぶ、という順で出力させたいのであれば、もう一工夫が必要ですね。
170
+
171
+
172
+
173
+ 一例として、以下のようにしてみました。
174
+
175
+
176
+
177
+ ```javascript
178
+
179
+ const names = name_mail.map(([name]) => name);
180
+
181
+ const m = new Map(name_data);
182
+
183
+
184
+
185
+ const matched_ary = names
186
+
187
+ .filter(name => m.has(name))
188
+
189
+ .sort((n1,n2) => m.get(n1) - m.get(n2))
190
+
191
+ .map(name => `${m.get(name)}${name}`);
192
+
193
+
194
+
195
+ const unmatched_ary = names
196
+
197
+ .filter(name => !m.has(name))
198
+
199
+ .map(_ => '0不明');
200
+
201
+
202
+
203
+ matched_ary.concat(unmatched_ary).forEach(str => console.log(str));
204
+
205
+ ```
206
+
207
+
208
+
209
+ 上記のコードを動作確認するためのサンプルを、以下
210
+
211
+
212
+
213
+ - **動作確認用サンプル(4):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/50/](https://jsfiddle.net/jun68ykt/rjeh3gbv/50/)
214
+
215
+
216
+
217
+ に作成しました。
218
+
219
+
220
+
221
+ なお、上記サンプル(4)では、正しく動作するかの検証のために、最初に与えられた2つの配列
222
+
223
+ - `name_mail`
224
+
225
+ - `name_data`
226
+
227
+
228
+
229
+
230
+
231
+ を Lodash の [shuffle](https://lodash.com/docs/4.17.11#shuffle) でランダムに並び替えてから、結果を得るためのロジックを動かしていますが、望む結果になっていることが確認できると思います。
232
+
233
+
234
+
235
+ もう一つ、上記のサンプル(4)では、`matched_ary` と `unmatched_ary` の2つの配列を作って、結果の表示のために再度結合していますが、これはやや回りくどいですね。なので、該当なしの場合の数値として非常に大きい値を入れておき、出力時に 0 で出力するという細工をしてみます。それが以下です。
236
+
237
+
238
+
239
+ ```javascript
240
+
241
+ const DEFAULT_ELEMENT = { name: '不明', value: 0 };
242
+
243
+
244
+
245
+ const names = name_mail.map(([name]) => name);
246
+
247
+ const m = new Map(name_data);
248
+
249
+
250
+
251
+ names
252
+
253
+ .map(name => ({ name, value: m.get(name) || Number.MAX_SAFE_INTEGER }))
254
+
255
+ .sort((e1,e2) => e1.value - e2.value)
256
+
257
+ .forEach(e => {
258
+
259
+ const { name, value } = e.value < Number.MAX_SAFE_INTEGER ? e : DEFAULT_ELEMENT;
260
+
261
+ console.log(`${value}${name}`);
262
+
263
+ });
264
+
265
+ ```
266
+
267
+ - **動作確認用サンプル(5):** [https://jsfiddle.net/jun68ykt/rjeh3gbv/62/](https://jsfiddle.net/jun68ykt/rjeh3gbv/62/)

2

テキスト修正

2018/12/30 23:50

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -14,15 +14,15 @@
14
14
 
15
15
 
16
16
 
17
- const name_data_map = new Map(name_data);
17
+ const map = new Map(name_data);
18
18
 
19
19
 
20
20
 
21
21
  name_mail.forEach(([name]) => {
22
22
 
23
- if (name_data_map.has(name)) {
23
+ if (map.has(name)) {
24
24
 
25
- console.log(`${name_data_map.get(name)}${name}`);
25
+ console.log(`${map.get(name)}${name}`);
26
26
 
27
27
  }
28
28
 
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- - [https://jsfiddle.net/jun68ykt/rjeh3gbv/19/](https://jsfiddle.net/jun68ykt/rjeh3gbv/19/)
51
+ - [https://jsfiddle.net/jun68ykt/rjeh3gbv/21/](https://jsfiddle.net/jun68ykt/rjeh3gbv/21/)
52
52
 
53
53
 
54
54
 

1

テキスト修正

2018/12/30 14:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -18,11 +18,11 @@
18
18
 
19
19
 
20
20
 
21
- name_mail.map(e => e[0]).forEach(name => {
21
+ name_mail.forEach(([name]) => {
22
22
 
23
23
  if (name_data_map.has(name)) {
24
24
 
25
- console.log(`${name_data_map.get(name)} ${name}`);
25
+ console.log(`${name_data_map.get(name)}${name}`);
26
26
 
27
27
  }
28
28
 
@@ -30,13 +30,25 @@
30
30
 
31
31
  ```
32
32
 
33
+ 実行結果:
34
+
35
+
36
+
37
+ > 1鈴木
38
+
39
+ 2田中
40
+
41
+ 3池田
42
+
43
+
44
+
33
45
 
34
46
 
35
47
  以下は、上記のコードを同作確認するために jsFiddle に上げたものです。
36
48
 
37
49
 
38
50
 
39
- - [https://jsfiddle.net/jun68ykt/rjeh3gbv/16/](https://jsfiddle.net/jun68ykt/rjeh3gbv/16/)
51
+ - [https://jsfiddle.net/jun68ykt/rjeh3gbv/19/](https://jsfiddle.net/jun68ykt/rjeh3gbv/19/)
40
52
 
41
53
 
42
54