三维立体坐标点,在x轴,y轴相同的情况下,取出z轴最大的坐标点

First Post:

Last Update:

题记

最近朋友遇到一个问题,一组三维立体坐标点,在x轴,y轴相同的情况下,要取出z轴最大的那个的坐标点。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const testArr = [
[45757.22541737171, 226532.12132301644, 52.45700027465815],
[45757.22541737171, 226532.12132301644, 162.45700027465816],
[45757.22541737171, 226532.12132301644, 72.45700027465816],
[45757.22541737171, 226532.12132301644, 82.45700027465816],
[45757.22541737171, 226532.12132301644, 92.45700027465816],
[45757.22541737171, 226532.12132301644, 102.45700027465816],
[45757.22541737171, 226532.12132301644, 112.45700027465816],
[45757.22541737171, 226532.12132301644, 122.45700027465816],
[45757.22541737171, 226532.12132301644, 132.45700027465816],
[45757.22541737171, 226532.12132301644, 142.45700027465816],
[45756.43914293511, 226562.64343069226, 52.457000274658206],
[45756.43914293511, 226562.64343069226, 62.457000274658206],
[45756.43914293511, 226562.64343069226, 72.45700027465821],
[45756.43914293511, 226562.64343069226, 82.45700027465821],
[45756.43914293511, 226562.64343069226, 92.45700027465821],
[45756.43914293511, 226562.64343069226, 102.45700027465821],
[45756.43914293511, 226562.64343069226, 112.45700027465821],
[45791.873784629126, 226560.04881890872, 52.457000274658206],
[45791.873784629126, 226560.04881890872, 172.4570002746582],
[45791.873784629126, 226560.04881890872, 162.4570002746582],
[45791.873784629126, 226560.04881890872, 142.4570002746582],
[45791.873784629126, 226560.04881890872, 92.45700027465821],
[45791.873784629126, 226560.04881890872, 102.45700027465821],
[45791.873784629126, 226560.04881890872, 112.45700027465821],
[45791.873784629126, 226560.04881890872, 122.45700027465821],
[45791.873784629126, 226560.04881890872, 132.4570002746582],
[45796.25954354428, 226532.31399971253, 52.45700027465815],
[45796.25954354428, 226532.31399971253, 182.45700027465816],
[45796.25954354428, 226532.31399971253, 162.45700027465816],
[45796.25954354428, 226532.31399971253, 82.45700027465816],
[45796.25954354428, 226532.31399971253, 92.45700027465816],
[45796.25954354428, 226532.31399971253, 102.45700027465816],
[45796.25954354428, 226532.31399971253, 112.45700027465816],
[45796.25954354428, 226532.31399971253, 122.45700027465816],
[45796.25954354428, 226532.31399971253, 132.45700027465816],
[45796.25954354428, 226532.31399971253, 142.45700027465816],
[45796.25954354428, 226532.31399971253, 152.45700027465816],
[45796.25954354428, 226532.31399971253, 162.45700027465816],
[45796.25954354428, 226532.31399971253, 182.45700027465816],
[45796.25954354428, 226532.31399971253, 182.45700027465816],
[45791.873784629126, 226560.04881890872, 142.4570002746582],
[45791.873784629126, 226560.04881890872, 152.4570002746582],
[45791.873784629126, 226560.04881890872, 162.4570002746582],
[45791.873784629126, 226560.04881890872, 172.4570002746582],
[45757.22541737171, 226532.12132301644, 162.45700027465816],
[45757.22541737171, 226532.12132301644, 162.45700027465816]
];

function getZcoordMax (sourceArr) {
const res = sourceArr.reduce((acc, curr) => {
let key = curr.slice(0, 2).join(','), arr, z = curr[2];
acc[key] = acc[key] || {};
acc[key].max = acc[key].max || [0, 0, 0];
arr = acc[key].arr;
if (arr) {
arr.push(z);
if (acc[key].max[2] <= z) acc[key].max = curr;
} else {
acc[key].arr = [z];
}
return acc
}, {});
return Object.keys(res).map(x => res[x].max);
}

输出结果:

1
2
3
4
5
6
[
[ 45757.22541737171, 226532.12132301644, 162.45700027465816 ],
[ 45756.43914293511, 226562.64343069226, 112.45700027465821 ],
[ 45791.873784629126, 226560.04881890872, 172.4570002746582 ],
[ 45796.25954354428, 226532.31399971253, 182.45700027465816 ]
]