Refactor: refactor domain sorting order

This commit is contained in:
SukkaW 2024-05-26 02:55:57 +08:00
parent 5b725192e3
commit 48b6ae2553
2 changed files with 101 additions and 14 deletions

View File

@ -75,4 +75,78 @@ describe('sortDomains', () => {
'.ec2-25-58-215-234.us-east-2.compute.amazonaws.com' '.ec2-25-58-215-234.us-east-2.compute.amazonaws.com'
]); ]);
}); });
it('samsung test case', () => {
expect(sortDomains([
'.notice.samsungcloudsolution.com',
'samsungqbe.com',
'samsungcloudsolution.com'
])).toStrictEqual([
'samsungqbe.com',
'samsungcloudsolution.com',
'.notice.samsungcloudsolution.com'
]);
expect(
sortDomains([
'.notice.samsungcloudsolution.com',
'.vdterms.samsungcloudsolution.com',
'.gamespromotion.samsungcloudsolution.com',
'.samsunggiveaways.com',
'.gld.samsungosp.com',
'samsungqbe.com',
'samsungcloudsolution.com',
'.sas.samsungcloudsolution.com',
'.prov.samsungcloudsolution.com',
'.musicid.samsungcloudsolution.com',
'.amauthprd.samsungcloudsolution.com',
'.noticecdn.samsungcloudsolution.com',
'.abtauthprd.samsungcloudsolution.com',
'.noticefile.samsungcloudsolution.com',
'.prderrordumphsm.samsungcloudsolution.com',
'samsungcloudsolution.net',
'.cdn.samsungcloudsolution.net',
'.lcprd1.samsungcloudsolution.net',
'.lcprd2.samsungcloudsolution.net',
'.samsungelectronics.com',
'.analytics-api.samsunghealthcn.com',
'.tracking.samsungknox.com',
'.analytics.samsungknox.com',
'.metrics.samsunglife.com',
'.smetrics.samsunglife.com',
'.nmetrics.samsungmobile.com',
'.rwww.samsungotn.net',
'.samsungpoland.com.pl'
])
).toStrictEqual([
'.gld.samsungosp.com',
'.rwww.samsungotn.net',
'samsungqbe.com',
'.tracking.samsungknox.com',
'.analytics.samsungknox.com',
'.metrics.samsunglife.com',
'.smetrics.samsunglife.com',
'.nmetrics.samsungmobile.com',
'.analytics-api.samsunghealthcn.com',
'.samsunggiveaways.com',
'.samsungpoland.com.pl',
'.samsungelectronics.com',
'samsungcloudsolution.com',
'.sas.samsungcloudsolution.com',
'.prov.samsungcloudsolution.com',
'.notice.samsungcloudsolution.com',
'.musicid.samsungcloudsolution.com',
'.vdterms.samsungcloudsolution.com',
'.amauthprd.samsungcloudsolution.com',
'.noticecdn.samsungcloudsolution.com',
'.abtauthprd.samsungcloudsolution.com',
'.noticefile.samsungcloudsolution.com',
'.gamespromotion.samsungcloudsolution.com',
'.prderrordumphsm.samsungcloudsolution.com',
'samsungcloudsolution.net',
'.cdn.samsungcloudsolution.net',
'.lcprd1.samsungcloudsolution.net',
'.lcprd2.samsungcloudsolution.net'
]);
});
}); });

View File

@ -14,27 +14,40 @@ export const compare = (a: string, b: string) => {
const tldtsOpt = { allowPrivateDomains: false, detectIp: false, validateHostname: false }; const tldtsOpt = { allowPrivateDomains: false, detectIp: false, validateHostname: false };
export const sortDomains = (inputs: string[]) => { export const sortDomains = (inputs: string[]) => {
const domains = inputs.reduce<Map<string, string>>((domains, cur) => { const domainMap = new Map<string, string>();
if (!domains.has(cur)) { const subdomainMap = new Map<string, string>();
for (let i = 0, len = inputs.length; i < len; i++) {
const cur = inputs[i];
if (!domainMap.has(cur)) {
const topD = tldts.getDomain(cur, tldtsOpt); const topD = tldts.getDomain(cur, tldtsOpt);
domains.set(cur, topD ?? cur); domainMap.set(cur, topD ?? cur);
}; }
return domains; if (!subdomainMap.has(cur)) {
}, new Map()); const subD = tldts.getSubdomain(cur, tldtsOpt);
subdomainMap.set(cur, subD ?? cur);
}
}
const sorter = (a: string, b: string) => { const sorter = (a: string, b: string) => {
if (a === b) return 0; if (a === b) return 0;
const $a = domains.get(a)!; const main_domain_a = domainMap.get(a)!;
const $b = domains.get(b)!; const main_domain_b = domainMap.get(b)!;
if (a === $a && b === $b) { let t = compare(main_domain_a, main_domain_b);
return compare(a, b);
if (t === 0) {
const subdomain_a = subdomainMap.get(a)!;
const subdomain_b = subdomainMap.get(b)!;
t = compare(subdomain_a, subdomain_b);
} }
return $a.localeCompare($b) || compare(a, b); if (t === 0 && (a !== main_domain_a || b !== main_domain_b)) {
t = compare(a, b);
}
return t;
}; };
sort(inputs, sorter); return sort(inputs, sorter);
return inputs;
}; };