fix: ignore emoji when sorting (#2687)

* fix: ignore emoji when sorting

* fix: use correct flow types

* fix: use emoji-regex
This commit is contained in:
Gaston Flores 2021-10-24 16:29:57 -03:00 committed by GitHub
parent d9f8d2e6d4
commit dc92e1ead4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 7 deletions

View File

@ -1,4 +1,5 @@
// @flow
import emojiRegex from "emoji-regex";
import { deburr } from "lodash";
import naturalSort from "natural-sort";
@ -9,20 +10,25 @@ type NaturalSortOptions = {
const sorter = naturalSort();
const regex = emojiRegex();
const stripEmojis = (value: string) => value.replace(regex, "");
const cleanValue = (value: string) => stripEmojis(deburr(value));
function getSortByField<T: Object>(
item: T,
keyOrCallback: string | ((T) => string)
keyOrCallback: string | ((obj: T) => string)
) {
if (typeof keyOrCallback === "string") {
return deburr(item[keyOrCallback]);
}
return keyOrCallback(item);
const field =
typeof keyOrCallback === "string"
? item[keyOrCallback]
: keyOrCallback(item);
return cleanValue(field);
}
function naturalSortBy<T>(
items: T[],
key: string | ((T) => string),
key: string | ((obj: T) => string),
sortOptions?: NaturalSortOptions
): T[] {
if (!items) return [];

View File

@ -0,0 +1,61 @@
// @flow
import naturalSort from "./naturalSort";
describe("#naturalSort", () => {
it("should sort a list of objects by the given key", () => {
const items = [{ name: "Joan" }, { name: "Pedro" }, { name: "Mark" }];
expect(naturalSort(items, "name")).toEqual([
{ name: "Joan" },
{ name: "Mark" },
{ name: "Pedro" },
]);
});
it("should accept a function as the object key", () => {
const items = [{ name: "Joan" }, { name: "Pedro" }, { name: "Mark" }];
expect(naturalSort(items, (item) => item.name)).toEqual([
{ name: "Joan" },
{ name: "Mark" },
{ name: "Pedro" },
]);
});
it("should accept natural-sort options", () => {
const items = [
{ name: "Joan" },
{ name: "joan" },
{ name: "Pedro" },
{ name: "Mark" },
];
expect(
naturalSort(items, "name", { direction: "desc", caseSensitive: true })
).toEqual([
{ name: "joan" },
{ name: "Pedro" },
{ name: "Mark" },
{ name: "Joan" },
]);
});
it("should ignore non basic latin letters", () => {
const items = [{ name: "Abel" }, { name: "Martín" }, { name: "Ávila" }];
expect(naturalSort(items, "name")).toEqual([
{ name: "Abel" },
{ name: "Ávila" },
{ name: "Martín" },
]);
});
it("should ignore emojis", () => {
const items = [
{ title: "🍔 Document 2" },
{ title: "🐻 Document 3" },
{ title: "🙂 Document 1" },
];
expect(naturalSort(items, "title")).toEqual([
{ title: "🙂 Document 1" },
{ title: "🍔 Document 2" },
{ title: "🐻 Document 3" },
]);
});
});