こんにちは
いっぺんにやろうとすると大変そうなので、段階を踏んで加工していきます。
まず、以下にて sensor_group_id
と uid
とのペアを要素とする配列を得ます。
javascript
1const pairs = data.group.map(x =>
2 x.list.map(y => [y.sensor_group_id, x.uid])
3).flat();
上記によって、 pairs
には以下が得られます。
[[ 117, 1001 ], [ 118, 1001 ], [ 119, 1002 ], [ 116, 1003 ], [ 117, 1003 ]]
次に、pairs
をソートします。
javascript
1pairs.sort((x1, x2) => x1[0] - x2[0] || x1[1] - x2[1]);
上記によって、 pairs
は以下のようになります。
[[ 116, 1003 ], [ 117, 1001 ], [ 117, 1003 ], [ 118, 1001 ], [ 119, 1002 ]]
上記の pairs
から以下によって result
を得ることができます。
javascript
1const result = pairs.reduce((ary, [gid, uid], i) => {
2 const x = i > 0 ? ary[ary.length - 1] : null;
3 if (x && x.sensor_group_id === gid) {
4 x.list.push(uid);
5 } else {
6 ary.push({ sensor_group_id: gid, list: [uid] });
7 }
8 return ary;
9}, []);
result
は以下のようになります。
[
{ sensor_group_id: 116, list: [ 1003 ] },
{ sensor_group_id: 117, list: [ 1001, 1003 ] },
{ sensor_group_id: 118, list: [ 1001 ] },
{ sensor_group_id: 119, list: [ 1002 ] }
]
以上、参考になれば幸いです。
追記
別案です。同じ sensor_group_id ごとのグルーピングを行うために、lodash の _.groupBy を使います。
javascript
1const data = {
2 group: [
3 {
4 uid: 1001,
5 list: [
6 { sensor_group_id: 117 },
7 { sensor_group_id: 118 }
8 ]
9 },
10 {
11 uid: 1002,
12 list: [
13 { sensor_group_id: 119 },
14 ]
15 },
16 {
17 uid: 1003,
18 list: [
19 { sensor_group_id: 116 },
20 { sensor_group_id: 117 },
21 ]
22 },
23 ]
24}
25
26const pairs = data.group.map(x =>
27 x.list.map(y => [y.sensor_group_id, x.uid])
28).flat();
29
30console.log(pairs);
31
32const groups = _(pairs)
33 .groupBy(0)
34 .mapValues(v => v.map(x => x[1]).sort((x1, x2) => x1 - x2))
35 .value();
36
37console.log(groups);
38
39const result = Object.entries(groups)
40 .sort(([x1], [x2]) => x1 - x2)
41 .map(([x, y]) => ({
42 sensor_group_id: +x,
43 list: y
44 }));
45
46console.log(result);
47
48
49