回答編集履歴

3

objがundefinedで動かなかったので修正

2019/01/14 14:14

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -196,9 +196,9 @@
196
196
 
197
197
  for (let it of array) {
198
198
 
199
- if (it.rev > ((obj[it.id] || {}).rev || 0)) {
199
+ if (it.rev > ((result[it.id] || {}).rev || 0)) {
200
-
200
+
201
- obj[it.id] = it;
201
+ result[it.id] = it;
202
202
 
203
203
  }
204
204
 

2

やっぱり破壊的処理の場合はreduce不要だった

2019/01/14 14:14

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -190,13 +190,21 @@
190
190
 
191
191
  const result = {};
192
192
 
193
+ // for...ofかforEachかは正直好み
194
+
193
- arrayList.forEach(array => array.reduce((obj, it) => {
195
+ for (let array of arrayList) {
196
+
194
-
197
+ for (let it of array) {
198
+
195
- if (it.rev > ((obj[it.id] || {}).rev || 0)) obj[it.id] = it;
199
+ if (it.rev > ((obj[it.id] || {}).rev || 0)) {
196
-
200
+
197
- return obj;
201
+ obj[it.id] = it;
198
-
202
+
199
- }, result));
203
+ }
204
+
205
+ }
206
+
207
+ }
200
208
 
201
209
  return Object.values(result);
202
210
 

1

Keyさんを見ながらひらめいたコード追記

2019/01/14 14:12

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -169,3 +169,57 @@
169
169
  // 3: {id: "c1", rev: 2, val: 30}
170
170
 
171
171
  ```
172
+
173
+
174
+
175
+ ---
176
+
177
+
178
+
179
+ keiさんのコードをヒントにいじったのがこちら
180
+
181
+ スマートになりつつの速度確保もそれなりに良い感じに仕上がってると思います。
182
+
183
+
184
+
185
+ ```JavaScript
186
+
187
+ // 別に2個の配列の引数に限定せず、3個でも4個でも受け付けるようになったけどいいよね?
188
+
189
+ const mergeArrayBasedIDByRevision = (...arrayList) => {
190
+
191
+ const result = {};
192
+
193
+ arrayList.forEach(array => array.reduce((obj, it) => {
194
+
195
+ if (it.rev > ((obj[it.id] || {}).rev || 0)) obj[it.id] = it;
196
+
197
+ return obj;
198
+
199
+ }, result));
200
+
201
+ return Object.values(result);
202
+
203
+ }
204
+
205
+
206
+
207
+ const ar1 = [{id:'a1', rev:1, val:10}, {id:'a2', rev:2, val:15}, {id:'b1', rev:1, val:20}]
208
+
209
+ const ar2 = [{id:'a1', rev:2, val:11}, {id:'a2', rev:1, val:12}, {id:'c1', rev:2, val:30}]
210
+
211
+
212
+
213
+ console.log(mergeArrayBasedIDByRevision(ar1, ar2));
214
+
215
+ // (4) [{…}, {…}, {…}, {…}]
216
+
217
+ // 0: {id: "a1", rev: 2, val: 11}
218
+
219
+ // 1: {id: "a2", rev: 2, val: 15}
220
+
221
+ // 2: {id: "b1", rev: 1, val: 20}
222
+
223
+ // 3: {id: "c1", rev: 2, val: 30}
224
+
225
+ ```