回答編集履歴

2

テキスト修正

2019/08/29 04:11

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -31,3 +31,199 @@
31
31
 
32
32
 
33
33
  以上、参考になれば幸いです。
34
+
35
+
36
+
37
+ ### 補足
38
+
39
+
40
+
41
+ 上記の
42
+
43
+ ```
44
+
45
+ _.isEqual(_.sortBy(array1), _.sortBy(array2))
46
+
47
+ ```
48
+
49
+ について、 配列`array1` と `array2` の要素もまた配列で、その配列の要素は数値だったり文字列だったりと、型が一定していない状況で、[_.sortBy](https://lodash.com/docs/4.17.15#sortBy) の第2引数を与えないときに、どのようなソートになるのかが不明確だったので、少し調べてみましたが、「このようなソートになる」ということを明確に把握することは(今の時点では)できませんでした。
50
+
51
+
52
+
53
+ そこで、ランダムな内容の `arr0` を作成し、これをシャッフルして `arr1` を作り、
54
+
55
+ ```
56
+
57
+ _.isEqual(_.sortBy(arr0), _.sortBy(arr1))
58
+
59
+ ```
60
+
61
+ が常に `true` になる(と言ってもさしつかえない)かを試してみました。以下、試してみたコードです。
62
+
63
+
64
+
65
+ #### index.js
66
+
67
+ ```javascript
68
+
69
+ const _ = require('lodash')
70
+
71
+
72
+
73
+ const makeSubArry = () => {
74
+
75
+ const len = _.sample([...Array(16)].map((e, i) => 5 + i));
76
+
77
+ return [...Array(len)].map(e => {
78
+
79
+ const type = _.sample(['bool', 'int', 'string', 'object']);
80
+
81
+ switch(type) {
82
+
83
+ case 'bool':
84
+
85
+ return _.sample([true, false]);
86
+
87
+ case 'int':
88
+
89
+ return Math.floor(1000.0 * Math.random()) % 100
90
+
91
+ case 'string':
92
+
93
+ return _.sample('abcdefghijklmnopqrstuvwxyz'.split(''))
94
+
95
+ case 'object':
96
+
97
+ return _.sample([
98
+
99
+ { x: 1, y: 2, z: 3 },
100
+
101
+ { x: 10, y: 20 },
102
+
103
+ { x: 11, z: 33 }
104
+
105
+ ])
106
+
107
+ }
108
+
109
+ })
110
+
111
+ }
112
+
113
+
114
+
115
+ const LENGTH = 100;
116
+
117
+
118
+
119
+ let equalCount = 0;
120
+
121
+ let notEqualCount = 0;
122
+
123
+
124
+
125
+ const test = () => {
126
+
127
+ const arr0 = [...Array(LENGTH)].map(makeSubArry);
128
+
129
+
130
+
131
+ for (let i=0; i < 10; i ++ ) {
132
+
133
+ const arr1 = _.shuffle(arr0);
134
+
135
+ const eq = _.isEqual(_.sortBy(arr0), _.sortBy(arr1));
136
+
137
+
138
+
139
+ if (eq)
140
+
141
+ equalCount ++;
142
+
143
+ else
144
+
145
+ notEqualCount ++;
146
+
147
+ }
148
+
149
+ }
150
+
151
+
152
+
153
+ for (let i=0; i < 1000; i ++ ) {
154
+
155
+ test();
156
+
157
+ }
158
+
159
+
160
+
161
+ console.log(`equalCount: ${equalCount}, notEqualCount: ${notEqualCount}`)
162
+
163
+ ```
164
+
165
+
166
+
167
+ #### package.json
168
+
169
+ ```json
170
+
171
+ {
172
+
173
+ "name": "q208845",
174
+
175
+ "version": "0.0.1",
176
+
177
+ "main": "index.js",
178
+
179
+ "dependencies": {
180
+
181
+ "lodash": "^4.17.15"
182
+
183
+ }
184
+
185
+ }
186
+
187
+ ```
188
+
189
+
190
+
191
+ 上記のコードでは、以下の内容を一回の試行とし、これを1000回、行います。
192
+
193
+
194
+
195
+ - `arr0` を長さ100の配列として作る。
196
+
197
+ - `arr0` の要素は以下を満たす配列
198
+
199
+ ・長さが、5以上 20以下
200
+
201
+ ・その要素は以下の a)〜 d)のいずれか
202
+
203
+     a) 真偽値(`true`または`false`)
204
+
205
+     b) 0以上99以下の整数
206
+
207
+     c) 小文字のアルファベット1文字から構成される文字列
208
+
209
+     d) 以下の3つのうちいずれかのオブジェクト
210
+
211
+       `{ x: 1, y: 2, z: 3 }`
212
+
213
+       `{ x: 10, y: 20 }`
214
+
215
+       `{ x: 11, z: 33 }`
216
+
217
+ - 上記の `arr0` をシャッフルして `arr1` を作成する。
218
+
219
+ - `arr0` と `arr1` に対して
220
+
221
+    `const eq = _.isEqual(_.sortBy(arr0), _.sortBy(arr1));`
222
+
223
+ を行い、eq の値が true になる回数と、 false になる回数をカウントする。
224
+
225
+ - 上記をひとつの `arr0` に対して、10回行う。
226
+
227
+
228
+
229
+ 期待している結果は、true になる回数が 1000 × 10 = 10000、 false になる回数がゼロというものでしたが、何回か実行してみたところ、期待どおりになりました。

1

テキスト修正

2019/08/29 04:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- まず、 [lodash](https://lodash.com/) を使うとうまくやれそうと思ったので、lodash でこのような問題の解を求める質問を探したところ、以下がありました。
5
+ [lodash](https://lodash.com/) を使うとうまくやれそうと思ったので、lodash でこのような問題の解を求める質問を探したところ、以下がありました。
6
6
 
7
7
 
8
8