こんにちは
lodash を使うとうまくやれそうと思ったので、lodash でこのような問題の解を求める質問を探したところ、以下がありました。
これのベストアンサー にある
javascript
1_.isEqual(_.sortBy(array1), _.sortBy(array2))
が使えるのでは思います。以下、そのサンプルです。
以上、参考になれば幸いです。
補足
上記の
_.isEqual(_.sortBy(array1), _.sortBy(array2))
について、 配列array1
と array2
の要素もまた配列で、その配列の要素は数値だったり文字列だったりと、型が一定していない状況で、_.sortBy の第2引数を与えないときに、どのようなソートになるのかが不明確だったので、少し調べてみましたが、「このようなソートになる」ということを明確に把握することは(今の時点では)できませんでした。
そこで、ランダムな内容の arr0
を作成し、これをシャッフルして arr1
を作り、
_.isEqual(_.sortBy(arr0), _.sortBy(arr1))
が常に true
になる(と言ってもさしつかえない)かを試してみました。以下、試してみたコードです。
index.js
javascript
1const _ = require('lodash')
2
3const makeSubArry = () => {
4 const len = _.sample([...Array(16)].map((e, i) => 5 + i));
5 return [...Array(len)].map(e => {
6 const type = _.sample(['bool', 'int', 'string', 'object']);
7 switch(type) {
8 case 'bool':
9 return _.sample([true, false]);
10 case 'int':
11 return Math.floor(1000.0 * Math.random()) % 100
12 case 'string':
13 return _.sample('abcdefghijklmnopqrstuvwxyz'.split(''))
14 case 'object':
15 return _.sample([
16 { x: 1, y: 2, z: 3 },
17 { x: 10, y: 20 },
18 { x: 11, z: 33 }
19 ])
20 }
21 })
22}
23
24const LENGTH = 100;
25
26let equalCount = 0;
27let notEqualCount = 0;
28
29const test = () => {
30 const arr0 = [...Array(LENGTH)].map(makeSubArry);
31
32 for (let i=0; i < 10; i ++ ) {
33 const arr1 = _.shuffle(arr0);
34 const eq = _.isEqual(_.sortBy(arr0), _.sortBy(arr1));
35
36 if (eq)
37 equalCount ++;
38 else
39 notEqualCount ++;
40 }
41}
42
43for (let i=0; i < 1000; i ++ ) {
44 test();
45}
46
47console.log(`equalCount: ${equalCount}, notEqualCount: ${notEqualCount}`)
package.json
json
1{
2 "name": "q208845",
3 "version": "0.0.1",
4 "main": "index.js",
5 "dependencies": {
6 "lodash": "^4.17.15"
7 }
8}
上記のコードでは、以下の内容を一回の試行とし、これを1000回、行います。
arr0
を長さ100の配列として作る。
arr0
の要素は以下を満たす配列
・長さが、5以上 20以下
・その要素は以下の a)〜 d)のいずれか
a) 真偽値(true
またはfalse
)
b) 0以上99以下の整数
c) 小文字のアルファベット1文字から構成される文字列
d) 以下の3つのうちいずれかのオブジェクト
{ x: 1, y: 2, z: 3 }
{ x: 10, y: 20 }
{ x: 11, z: 33 }
- 上記の
arr0
をシャッフルして arr1
を作成する。
arr0
と arr1
に対して
const eq = _.isEqual(_.sortBy(arr0), _.sortBy(arr1));
を行い、eq の値が true になる回数と、 false になる回数をカウントする。
期待している結果は、true になる回数が 1000 × 10 = 10000、 false になる回数がゼロというものでしたが、何回か実行してみたところ、期待どおりになりました。