回答編集履歴
2
テキスト修正
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
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
[lodash](https://lodash.com/) を使うとうまくやれそうと思ったので、lodash でこのような問題の解を求める質問を探したところ、以下がありました。
|
6
6
|
|
7
7
|
|
8
8
|
|