From 0aa5094bfda34d2c1fd88de034fa150651c77039 Mon Sep 17 00:00:00 2001 From: Mirzoev Ruslan <48970799+RuSaG0@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:53:28 +0300 Subject: [PATCH] merge: add alphanumerical sort (#872) * alphanumerical sort * [/pull/872] add description to alphanumerical sort * [/pull/872] add description to localCompare fn * [/pull/872] code formatter --- Sorts/AlphaNumericalSort.js | 38 ++++++++++++++++++++++++++ Sorts/test/AlphaNumericalSort.test.js | 39 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 Sorts/AlphaNumericalSort.js create mode 100644 Sorts/test/AlphaNumericalSort.test.js diff --git a/Sorts/AlphaNumericalSort.js b/Sorts/AlphaNumericalSort.js new file mode 100644 index 000000000..fb6be8f42 --- /dev/null +++ b/Sorts/AlphaNumericalSort.js @@ -0,0 +1,38 @@ +/* + https://en.wikipedia.org/wiki/Natural_sort_order + + In computing, natural sort order (or natural sorting) is the ordering of strings in alphabetical order, + except that multi-digit numbers are treated atomically, i.e., as if they were a single character. Natural sort order + has been promoted as being more human-friendly ("natural") than machine-oriented, pure alphabetical sort order.[1] + + For example, in alphabetical sorting, "z11" would be sorted before "z2" because the "1" in the first string is sorted as smaller + than "2", while in natural sorting "z2" is sorted before "z11" because "2" is treated as smaller than "11". + + Alphabetical sorting: + 1.z11 + 2.z2 + + Natural sorting: + 1. z2 + 2. z11 + + P.S. use this function, as there are a lot of implementations on the stackoverflow and other forums, but many of them don't work correctly (can't pass all my tests) + +*/ + +const alphaNumericalSort = (a, b) => { + /* + https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare + + The localeCompare() method returns a number indicating whether a reference string comes before, or after, or is the same as the given string in sort order. + + The new locales and options arguments let applications specify the language whose sort order should be used and customize the behavior of the function. + In older implementations, which ignore the locales and options arguments, the locale and sort order used are entirely implementation-dependent. + Syntax: + localeCompare(compareString, locales, options) + + */ + return a.localeCompare(b, undefined, { numeric: true }) +} + +export { alphaNumericalSort } diff --git a/Sorts/test/AlphaNumericalSort.test.js b/Sorts/test/AlphaNumericalSort.test.js new file mode 100644 index 000000000..0e1c1c236 --- /dev/null +++ b/Sorts/test/AlphaNumericalSort.test.js @@ -0,0 +1,39 @@ +import { alphaNumericalSort } from '../AlphaNumericalSort' + +describe('alphaNumericalComparer', () => { + test('given array of eng symbols return correct sorted array', () => { + const src = ['b', 'a', 'c'] + src.sort(alphaNumericalSort) + expect(src).toEqual(['a', 'b', 'c']) + }) + + test('given array of numbers return correct sorted array', () => { + const src = ['15', '0', '5'] + src.sort(alphaNumericalSort) + expect(src).toEqual(['0', '5', '15']) + }) + + test('correct sort with numbers and strings', () => { + const src = ['3', 'a1b15c', 'z', 'a1b14c'] + src.sort(alphaNumericalSort) + expect(src).toEqual(['3', 'a1b14c', 'a1b15c', 'z']) + }) + + test('correct sort with long numbers', () => { + const src = ['abc999999999999999999999999999999999cba', 'abc999999999999999999999999999999990cba', 'ab'] + src.sort(alphaNumericalSort) + expect(src).toEqual(['ab', 'abc999999999999999999999999999999990cba', 'abc999999999999999999999999999999999cba']) + }) + + test('correct sort with z prefix', () => { + const src = ['z', 'abc003def', 'abc1def', 'a'] + src.sort(alphaNumericalSort) + expect(src).toEqual(['a', 'abc1def', 'abc003def', 'z']) + }) + + test('correct sort with other language', () => { + const src = ['а10б', 'а2б', 'в10г', 'в05г'] + src.sort(alphaNumericalSort) + expect(src).toEqual(['а2б', 'а10б', 'в05г', 'в10г']) + }) +})