回答編集履歴

8

テキスト修正

2019/08/16 12:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,15 +2,19 @@
2
2
 
3
3
 
4
4
 
5
- **はじめに書いた回答(※)は、質問を誤読しておりました。申し訳ありません **
5
+ (gentaroさんからのご指摘どおり、はじめに書いた回答(※追記2参照)は、質問を誤読しておりまして、質問者様の混乱を避けるめ消去しました。申し訳ありません
6
6
 
7
+
8
+
7
- 再考しましたが、[_.groupBy](https://lodash.com/docs/4.17.15#groupBy) が使えるのではと思います。
9
+ この回答では、与えられるデータは、以下のように、ご質問にあるようなプロパティを持つオブジェクトの配列であることを前提にしました(前提では、ご質問の要件は満たせない場合は、コメント頂ければと思います。)
8
10
 
9
11
 
10
12
 
11
13
  ```javascript
12
14
 
13
- const data = [{
15
+ const data = [
16
+
17
+ {
14
18
 
15
19
  ID: 1,
16
20
 
@@ -48,19 +52,43 @@
48
52
 
49
53
  ];
50
54
 
51
-
52
-
53
- const groupedData = _.groupBy(data, e => `${e.KEY1}/${e.KEY2}/${e.KEY3}`);
55
+ ```
54
56
 
55
57
 
56
58
 
59
+ 上記を前提として、[_.groupBy](https://lodash.com/docs/#groupBy) を使って以下のようにすると、ID以外のプロパティが等しいオブジェクトを要素とする配列にして、グループ化することができます。
60
+
61
+
62
+
63
+ ```javascript
64
+
57
- const duplicatedData = Object.values(groupedData).filter(ary => ary.length > 1);
65
+ const groupedData = _.groupBy(data, e => `${e.KEY1}/${e.KEY2}/${e.KEY3}`);
58
66
 
59
67
  ```
60
68
 
61
69
 
62
70
 
63
- 上記のコード `groupedData` には、ID以外のプロパティが同じオブジェクトごとにグルーピングしたオブジェクトが入ります。次の行でグルーピングされたオブジェクト値である配列の長さが、 1 よりも大きいものを抽出します。
71
+ 上記で作られるオブジェクト `groupedData` のプロパティ以下ようなKEY1, KEY2, KEY3 `/` で区切った文字列です。
72
+
73
+
74
+
75
+ ```
76
+
77
+ "ABC/20/大阪"
78
+
79
+ ```
80
+
81
+
82
+
83
+ 重複した要素を取得するには、`groupedData`の値である配列のうち、長さが 1 より大きいものを選び出せばよいので、以下のようにします。
84
+
85
+
86
+
87
+ ```javascript
88
+
89
+ const duplicatedData = Object.values(groupedData).filter(ary => ary.length > 1);
90
+
91
+ ```
64
92
 
65
93
 
66
94
 
@@ -72,6 +100,22 @@
72
100
 
73
101
 
74
102
 
103
+ ### 追記1
75
104
 
76
105
 
106
+
107
+ 参考までに、冒頭に書いた形式の配列 `data`に 100個の要素を生成して、上記に記載した[_.groupBy](https://lodash.com/docs/#groupBy)を使ったコードによって、重複している要素を一覧するコードを以下に作成しました。
108
+
109
+
110
+
111
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/mvtqhx27/9/](https://jsfiddle.net/jun68ykt/mvtqhx27/9/)
112
+
113
+
114
+
115
+
116
+
117
+ ### 追記2
118
+
119
+
120
+
77
- (※はじめに書いた回答では、ID以外のプロパティが同じオブジェクトの重複を除去するコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考に、ておりました。
121
+ すでに消去した、はじめに書いた回答では、ID以外のプロパティが同じオブジェクトの重複を除去するコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考に、回答していました。

7

テキスト修正

2019/08/16 12:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -74,4 +74,4 @@
74
74
 
75
75
 
76
76
 
77
- (※ はじめに書いた回答では、ID以外のプロパティが同じオブジェクト重複しないような処理をするコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考にして書いておりました。)
77
+ (※はじめに書いた回答では、ID以外のプロパティが同じオブジェクト重複を除去するコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考に書いておりました。)

6

テキスト修正

2019/08/16 07:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- **(はじめに書いた回答(※)は、質問を誤読しておりました。申し訳ありません。)**
5
+ **はじめに書いた回答(※)は、質問を誤読しておりました。申し訳ありません **
6
6
 
7
7
  再考しましたが、[_.groupBy](https://lodash.com/docs/4.17.15#groupBy) が使えるのではと思います。
8
8
 

5

テキスト修正

2019/08/16 06:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- **(はじめに書いた回答は、質問を誤読しておりました。申し訳ありません。)**
5
+ **(はじめに書いた回答(※)は、質問を誤読しておりました。申し訳ありません。)**
6
6
 
7
7
  再考しましたが、[_.groupBy](https://lodash.com/docs/4.17.15#groupBy) が使えるのではと思います。
8
8
 
@@ -69,3 +69,9 @@
69
69
 
70
70
 
71
71
  以上、参考になれば幸いです。
72
+
73
+
74
+
75
+
76
+
77
+ (※ はじめに書いた回答では、ID以外のプロパティが同じオブジェクトが重複しないような処理をするコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考にして書いておりました。)

4

テキスト修正

2019/08/16 06:45

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
 
62
62
 
63
- 上記のコードで、 `groupedData` には、ID以外のプロパティが同じオブジェクトごとにグルーピングしたオブジェクトが入ります。次の行で、グルーピングされたオブジェクトの配列の長さが 1 よりも大きい配列を抽出します。
63
+ 上記のコードで、 `groupedData` には、ID以外のプロパティが同じオブジェクトごとにグルーピングしたオブジェクトが入ります。次の行で、グルーピングされたオブジェクトの値である配列の長さが 1 よりも大きいものを抽出します。
64
64
 
65
65
 
66
66
 

3

テキスト修正

2019/08/16 06:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  **(はじめに書いた回答は、質問を誤読しておりました。申し訳ありません。)**
6
6
 
7
- 再考しましたが、_.groupBy が使えるのではと思います。
7
+ 再考しましたが、[_.groupBy](https://lodash.com/docs/4.17.15#groupBy) が使えるのではと思います。
8
8
 
9
9
 
10
10
 

2

テキスト修正

2019/08/16 06:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,15 +2,9 @@
2
2
 
3
3
 
4
4
 
5
- 以下の投稿
5
+ **(はじめに書いた回答は、質問を誤読しておりました。申し訳ありません。)**
6
6
 
7
-
8
-
9
- - stackoverflow: [Lodash remove duplicates from array](https://stackoverflow.com/questions/31740155/lodash-remove-duplicates-from-array)
10
-
11
-
12
-
13
- で、Goodの数多い[この回答](https://stackoverflow.com/a/31740263) と同様に [_.uniqBy](https://lodash.com/docs/4.17.15#uniqBy) 使ってみとすると、以下ようになるかなと思います。
7
+ 再考しましたが、_.groupBy 使るのではと思います。
14
8
 
15
9
 
16
10
 
@@ -56,76 +50,22 @@
56
50
 
57
51
 
58
52
 
59
- const uniqData = _.uniqBy(data, e => `${e.KEY1}/${e.KEY2}/${e.KEY3}`);
53
+ const groupedData = _.groupBy(data, e => `${e.KEY1}/${e.KEY2}/${e.KEY3}`);
54
+
55
+
56
+
57
+ const duplicatedData = Object.values(groupedData).filter(ary => ary.length > 1);
60
58
 
61
59
  ```
62
60
 
63
61
 
64
62
 
65
- - **動作確認用:** [https://jsfiddle.net/jun68ykt/Lvs4rcqf/1/](https://jsfiddle.net/jun68ykt/Lvs4rcqf/1/)
63
+ 上記のコードで、 `groupedData` には、ID以外のプロパティが同じオブジェクトごとにグルーピングしたオブジェクトが入ります。次の行で、グルーピングされたオブジェクトの配列の長さが 1 よりも大きい配列を抽出します。
66
64
 
67
65
 
68
66
 
69
- 以上参考になれば幸いです。
67
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/5g827ybd/7/](https://jsfiddle.net/jun68ykt/5g827ybd/7/)
70
68
 
71
69
 
72
70
 
73
- ### 追記
74
-
75
-
76
-
77
- もう一案、作ってみました。 [_.isEqual](https://lodash.com/docs/4.17.15#isEqual) と [_.omit](https://lodash.com/docs/4.17.15#omit) を使って、二つのオブジェクトの同値性を判定する関数 `equals(obj1, obj2)` を作り、これを [_.uniqWith](https://lodash.com/docs/4.17.15#uniqWith) から使います。
78
-
79
-
80
-
81
- ```javascript
82
-
83
- const data = [{
84
-
85
- ID: 1,
86
-
87
- KEY1: 'ABC',
88
-
89
- KEY2: 20,
90
-
91
- KEY3: '大阪'
92
-
93
- },
94
-
95
- {
96
-
97
- ID: 2,
98
-
99
- KEY1: 'ABC',
100
-
101
- KEY2: 20,
102
-
103
- KEY3: '東京'
104
-
105
- },
106
-
107
- {
108
-
109
- ID: 3,
110
-
111
- KEY1: 'ABC',
112
-
113
- KEY2: 20,
114
-
115
- KEY3: '大阪'
116
-
117
- }
118
-
119
- ];
120
-
121
-
122
-
123
- const equals = (obj1, obj2) => _.isEqual(_.omit(obj1, 'ID'), _.omit(obj2, 'ID'))
124
-
125
-
126
-
127
- const uniqData = _.uniqWith(data, equals);
128
-
129
- ```
130
-
131
- - **動作確認用:** [https://jsfiddle.net/jun68ykt/Lvs4rcqf/11/](https://jsfiddle.net/jun68ykt/Lvs4rcqf/11/)
71
+ 以上、参考になれば幸いです。

1

テキスト修正

2019/08/16 06:33

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -67,3 +67,65 @@
67
67
 
68
68
 
69
69
  以上参考になれば幸いです。
70
+
71
+
72
+
73
+ ### 追記
74
+
75
+
76
+
77
+ もう一案、作ってみました。 [_.isEqual](https://lodash.com/docs/4.17.15#isEqual) と [_.omit](https://lodash.com/docs/4.17.15#omit) を使って、二つのオブジェクトの同値性を判定する関数 `equals(obj1, obj2)` を作り、これを [_.uniqWith](https://lodash.com/docs/4.17.15#uniqWith) から使います。
78
+
79
+
80
+
81
+ ```javascript
82
+
83
+ const data = [{
84
+
85
+ ID: 1,
86
+
87
+ KEY1: 'ABC',
88
+
89
+ KEY2: 20,
90
+
91
+ KEY3: '大阪'
92
+
93
+ },
94
+
95
+ {
96
+
97
+ ID: 2,
98
+
99
+ KEY1: 'ABC',
100
+
101
+ KEY2: 20,
102
+
103
+ KEY3: '東京'
104
+
105
+ },
106
+
107
+ {
108
+
109
+ ID: 3,
110
+
111
+ KEY1: 'ABC',
112
+
113
+ KEY2: 20,
114
+
115
+ KEY3: '大阪'
116
+
117
+ }
118
+
119
+ ];
120
+
121
+
122
+
123
+ const equals = (obj1, obj2) => _.isEqual(_.omit(obj1, 'ID'), _.omit(obj2, 'ID'))
124
+
125
+
126
+
127
+ const uniqData = _.uniqWith(data, equals);
128
+
129
+ ```
130
+
131
+ - **動作確認用:** [https://jsfiddle.net/jun68ykt/Lvs4rcqf/11/](https://jsfiddle.net/jun68ykt/Lvs4rcqf/11/)