From 134cfb5fa9eca97a96d1fe0c797822de5f869b57 Mon Sep 17 00:00:00 2001 From: rich Date: Fri, 13 Sep 2024 13:47:28 +0100 Subject: [PATCH] Add sortByNumericValue function We want to be able to sort by the number of open issues too. To keep things DRY it makes sense to add a function that allows us to sort by any property of a repo that has a numeric value. --- utils/sorting.js | 15 ++++++++++++++ utils/sorting.test.js | 48 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/utils/sorting.js b/utils/sorting.js index 8aa50b0..12e6503 100644 --- a/utils/sorting.js +++ b/utils/sorting.js @@ -18,3 +18,18 @@ export const sortByOpenPrs = (repos, sortDirection) => { } return repos.sort((a, b) => b.openPrsCount - a.openPrsCount); }; + +/** + * Sorts repos by the a numeric value + * @param {UiRepo[]} repos + * @param {SortDirection} sortDirection + * @param {string} key - The key to sort by + * @returns {UiRepo[]} + */ +export const sortByNumericValue = (repos, sortDirection, key) => { + if (!sortDirection) return repos; + if (sortDirection === "asc") { + return repos.sort((a, b) => a[key] - b[key]); + } + return repos.sort((a, b) => b[key] - a[key]); +}; diff --git a/utils/sorting.test.js b/utils/sorting.test.js index 4ae6884..ceece0f 100644 --- a/utils/sorting.test.js +++ b/utils/sorting.test.js @@ -1,6 +1,6 @@ import { describe, it } from "node:test"; import expect from "node:assert"; -import { sortByOpenPrs } from "./sorting.js"; +import { sortByOpenPrs, sortByNumericValue } from "./sorting.js"; describe("sortByOpenPrs", () => { it("returns the original array if sortDirection is not provided", () => { @@ -47,3 +47,49 @@ describe("sortByOpenPrs", () => { ]); }); }); + +describe("sortByNumericValue", () => { + it("returns the original array if sortDirection is not provided", () => { + const repos = [ + { name: "Repo 1", value: 5 }, + { name: "Repo 2", value: 3 }, + { name: "Repo 3", value: 7 }, + ]; + + const result = sortByNumericValue(repos, null, "value"); + + expect.deepEqual(result, repos); + }); + + it("sorts the array in ascending order by the specified key if sortDirection is 'asc'", () => { + const repos = [ + { name: "Repo 1", value: 5 }, + { name: "Repo 2", value: 3 }, + { name: "Repo 3", value: 7 }, + ]; + + const result = sortByNumericValue(repos, "asc", "value"); + + expect.deepEqual(result, [ + { name: "Repo 2", value: 3 }, + { name: "Repo 1", value: 5 }, + { name: "Repo 3", value: 7 }, + ]); + }); + + it("sorts the array in descending order by the specified key if sortDirection is 'desc'", () => { + const repos = [ + { name: "Repo 1", value: 5 }, + { name: "Repo 2", value: 3 }, + { name: "Repo 3", value: 7 }, + ]; + + const result = sortByNumericValue(repos, "desc", "value"); + + expect.deepEqual(result, [ + { name: "Repo 3", value: 7 }, + { name: "Repo 1", value: 5 }, + { name: "Repo 2", value: 3 }, + ]); + }); +});