回答編集履歴
8
テキスト修正
test
CHANGED
@@ -2,15 +2,19 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
(gentaroさんからのご指摘どおり、はじめに書いた回答(※追記2参照)は、質問を誤読しておりまして、質問者様の混乱を避けるため消去しました。申し訳ありません )
|
6
6
|
|
7
|
+
|
8
|
+
|
7
|
-
|
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
|
-
|
55
|
+
```
|
54
56
|
|
55
57
|
|
56
58
|
|
59
|
+
上記を前提として、[_.groupBy](https://lodash.com/docs/#groupBy) を使って以下のようにすると、ID以外のプロパティが等しいオブジェクトを要素とする配列にして、グループ化することができます。
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
```javascript
|
64
|
+
|
57
|
-
const
|
65
|
+
const groupedData = _.groupBy(data, e => `${e.KEY1}/${e.KEY2}/${e.KEY3}`);
|
58
66
|
|
59
67
|
```
|
60
68
|
|
61
69
|
|
62
70
|
|
63
|
-
上記
|
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
|
-
|
121
|
+
すでに消去した、はじめに書いた回答では、ID以外のプロパティが同じオブジェクトの重複を除去するコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考に、回答していました。
|
7
テキスト修正
test
CHANGED
@@ -74,4 +74,4 @@
|
|
74
74
|
|
75
75
|
|
76
76
|
|
77
|
-
(※
|
77
|
+
(※はじめに書いた回答では、ID以外のプロパティが同じオブジェクトの重複を除去するコードを、stackoverflow の [この回答](https://stackoverflow.com/a/31740263) を参考に、書いておりました。)
|
6
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
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
|
-
|
7
|
+
再考しましたが、_.groupBy が使えるのではと思います。
|
14
8
|
|
15
9
|
|
16
10
|
|
@@ -56,76 +50,22 @@
|
|
56
50
|
|
57
51
|
|
58
52
|
|
59
|
-
const u
|
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
|
-
|
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
テキスト修正
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/)
|