Skip to content
This repository was archived by the owner on Mar 15, 2024. It is now read-only.

Commit ad2feaf

Browse files
committed
natural sort
1 parent 186eda0 commit ad2feaf

File tree

3 files changed

+51
-32
lines changed

3 files changed

+51
-32
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
"express": "^4.16.4",
5656
"express-jwt": "^5.3.1",
5757
"helmet": "^3.16.0",
58+
"javascript-natural-sort": "^0.7.1",
5859
"jsonwebtoken": "^8.5.1",
5960
"lodash": "^4.17.11",
6061
"method-override": "^3.0.0",

src/rest-api/controllers/postcodes.ts

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import axios from 'axios'
22
import { NextFunction, Request, Response } from 'express'
3+
import * as naturalSort from 'javascript-natural-sort'
4+
import * as groupBy from 'lodash/groupBy'
35
import * as proj4 from 'proj4'
46

57
proj4.defs([
@@ -41,40 +43,51 @@ export async function search(
4143

4244
const { data } = await axios.get(url)
4345

46+
const results0 = data.map(result => {
47+
const { x: longitude, y: latitude } = proj4.transform(
48+
projections.ordnanceSurvey,
49+
projections.standard,
50+
[Number(result.X), Number(result.Y)]
51+
)
52+
53+
return {
54+
id: result.UPRN.toString(),
55+
name: [
56+
result.ORGANISATION,
57+
result.SAO,
58+
[result.PAO, result.STREET].filter(Boolean).join(' '),
59+
]
60+
.filter(Boolean)
61+
.join(', '),
62+
uprn: result.UPRN.toString(),
63+
updrn: result.UPRN.toString(),
64+
x: Number(result.X),
65+
y: Number(result.Y),
66+
lat: latitude,
67+
lng: longitude,
68+
rawData: result,
69+
}
70+
})
71+
72+
const results1 = groupBy(results0, r => {
73+
return [r.rawData.PAO, r.rawData.STREET].filter(Boolean).join(' ')
74+
})
75+
76+
const results = []
77+
78+
Object.keys(results1)
79+
.sort(naturalSort)
80+
.forEach(k => {
81+
Object.values(results1[k])
82+
.sort((a: any, b: any) => {
83+
return naturalSort(a.rawData.SAO, b.rawData.SAO)
84+
})
85+
.forEach(sorted => results.push(sorted))
86+
})
87+
4488
response.json({
4589
localAuthority,
46-
results: data
47-
.map(result => {
48-
const { x: longitude, y: latitude } = proj4.transform(
49-
projections.ordnanceSurvey,
50-
projections.standard,
51-
[Number(result.X), Number(result.Y)]
52-
)
53-
54-
return {
55-
id: result.UPRN.toString(),
56-
name: [
57-
result.ORGANISATION,
58-
result.SAO,
59-
[result.PAO, result.STREET].filter(Boolean).join(' '),
60-
]
61-
.filter(Boolean)
62-
.join(', '),
63-
uprn: result.UPRN.toString(),
64-
updrn: result.UPRN.toString(),
65-
x: Number(result.X),
66-
y: Number(result.Y),
67-
lat: longitude,
68-
lng: longitude,
69-
rawData: result,
70-
}
71-
})
72-
.sort((a, b) => {
73-
const aa = [a.rawData.PAO, a.rawData.STREET].filter(Boolean).join(' ')
74-
const bb = [b.rawData.PAO, b.rawData.STREET].filter(Boolean).join(' ')
75-
// return bb < aa
76-
return aa < bb ? -1 : aa > bb ? 1 : 0
77-
}),
90+
results,
7891
})
7992
} catch (e) {
8093
next(e)

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4406,6 +4406,11 @@ istanbul-reports@^2.1.1:
44064406
dependencies:
44074407
handlebars "^4.1.2"
44084408

4409+
javascript-natural-sort@^0.7.1:
4410+
version "0.7.1"
4411+
resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
4412+
integrity sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=
4413+
44094414
jest-changed-files@^24.8.0:
44104415
version "24.8.0"
44114416
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b"

0 commit comments

Comments
 (0)