Compare commits
No commits in common. "1022837ec922555cd6255779aba08587e89a42bc" and "d23e5ce91a65d59529163b34dbcf1b11ec1775db" have entirely different histories.
1022837ec9
...
d23e5ce91a
18
index.js
18
index.js
|
@ -1,25 +1,17 @@
|
||||||
const sortby = (...properties) => (a, b) => {
|
const sortby = (properties) => (a, b) => {
|
||||||
// 'base' treat accent as there base character
|
|
||||||
const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' })
|
|
||||||
|
|
||||||
// if items is {prop1:value1, prop2:value2}
|
// if items is {prop1:value1, prop2:value2}
|
||||||
// then sort(['prop1', 'desc', 'prop2'])
|
// then sort(['prop1', 'desc', 'prop2'])
|
||||||
// will sort by prop1 desc and prop2
|
// will sort by prop1 desc and prop2
|
||||||
for (let i = 0; i < properties.length; i++) {
|
for (var i = 0; i < properties.length; i++) {
|
||||||
const property = properties[i]
|
var property = properties[i]
|
||||||
|
|
||||||
let order = -1
|
let order = -1
|
||||||
if (i + 1 < properties.length) {
|
if (i + 1 < properties.length && properties[i + 1] === 'desc') {
|
||||||
const next = properties[i + 1]
|
|
||||||
|
|
||||||
if (next === 'desc') {
|
|
||||||
order = 1
|
order = 1
|
||||||
i++
|
i++
|
||||||
} else if (next === 'asc') {
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' })
|
||||||
const compare = collator.compare(a[property], b[property])
|
const compare = collator.compare(a[property], b[property])
|
||||||
if (compare < 0) return order
|
if (compare < 0) return order
|
||||||
if (compare > 0) return -order
|
if (compare > 0) return -order
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { deepEqual as equal } from 'node:assert/strict'
|
import { deepEqual as equal } from 'node:assert/strict'
|
||||||
import { metaltest } from 'metaltest'
|
import { metaltest } from 'metaltest'
|
||||||
const test = metaltest('Sort by')
|
const test = metaltest('Sort')
|
||||||
export { test }
|
export { test }
|
||||||
|
|
||||||
import { sortby } from '../index.js'
|
import { sortby } from '../index.js'
|
||||||
|
@ -11,7 +11,8 @@ const data = [
|
||||||
]
|
]
|
||||||
|
|
||||||
test('sort by name ascending', () => {
|
test('sort by name ascending', () => {
|
||||||
const result = data.sort(sortby('name'))
|
const result = data.sort(sortby(['name']))
|
||||||
|
|
||||||
|
|
||||||
equal(result, [
|
equal(result, [
|
||||||
{ age: 40, name: "Persone 1", new: true },
|
{ age: 40, name: "Persone 1", new: true },
|
||||||
|
@ -20,7 +21,8 @@ test('sort by name ascending', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
test('sort by age ascending', () => {
|
test('sort by age ascending', () => {
|
||||||
const result = data.sort(sortby('age'))
|
const result = data.sort(sortby(['age']))
|
||||||
|
|
||||||
|
|
||||||
equal(result, [
|
equal(result, [
|
||||||
{ age: 17, name: "Persone 2", new: false },
|
{ age: 17, name: "Persone 2", new: false },
|
||||||
|
@ -29,7 +31,8 @@ test('sort by age ascending', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
test('sort by age descending', () => {
|
test('sort by age descending', () => {
|
||||||
const result = data.sort(sortby('age', 'desc'))
|
const result = data.sort(sortby(['age', 'desc']))
|
||||||
|
|
||||||
|
|
||||||
equal(result, [
|
equal(result, [
|
||||||
{ age: 40, name: "Persone 1", new: true },
|
{ age: 40, name: "Persone 1", new: true },
|
||||||
|
@ -38,7 +41,8 @@ test('sort by age descending', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
test('sort by new descending', () => {
|
test('sort by new descending', () => {
|
||||||
const result = data.sort(sortby('new', 'desc'))
|
const result = data.sort(sortby(['new', 'desc']))
|
||||||
|
|
||||||
|
|
||||||
equal(result, [
|
equal(result, [
|
||||||
{ age: 40, name: "Persone 1", new: true },
|
{ age: 40, name: "Persone 1", new: true },
|
||||||
|
@ -46,13 +50,6 @@ test('sort by new descending', () => {
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
test('sort with accent, should not change order', () => {
|
|
||||||
const data = [{ name: 'è' }, { name: 'é' }, { name: 'e' }]
|
|
||||||
|
|
||||||
const result = data.sort(sortby('name'))
|
|
||||||
|
|
||||||
equal(result, [{ name: 'è' }, { name: 'é' }, { name: 'e' }])
|
|
||||||
})
|
|
||||||
|
|
||||||
import { runifmain, summaryreporter, errorreporter } from 'metaltest'
|
import { runifmain, summaryreporter, errorreporter } from 'metaltest'
|
||||||
await runifmain(import.meta, () => test.run(summaryreporter(), errorreporter()))
|
await runifmain(import.meta, () => test.run(summaryreporter(), errorreporter()))
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "sortby",
|
"name": "sortby",
|
||||||
"version": "2.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "sortby",
|
"name": "sortby",
|
||||||
"version": "2.0.0",
|
"version": "1.0.0",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"metaltest": "git+https://git.tranche.ca/fmatte/metaltest"
|
"metaltest": "git+https://git.tranche.ca/fmatte/metaltest"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "sortby",
|
"name": "sortby",
|
||||||
"description": "Sort object by property name",
|
"description": "Sort object by property name",
|
||||||
"version": "2.0.0",
|
"version": "1.0.0",
|
||||||
"author": "Frédéric Matte <fmatte@gmail.com>",
|
"author": "Frédéric Matte <fmatte@gmail.com>",
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
|
Loading…
Reference in New Issue