diff options
-rw-r--r-- | Base/res/js/Spreadsheet/runtime.js | 58 | ||||
-rw-r--r-- | Userland/Applications/Spreadsheet/Tests/free-functions.js | 21 |
2 files changed, 79 insertions, 0 deletions
diff --git a/Base/res/js/Spreadsheet/runtime.js b/Base/res/js/Spreadsheet/runtime.js index 8b48b2f56f..c7416a63e9 100644 --- a/Base/res/js/Spreadsheet/runtime.js +++ b/Base/res/js/Spreadsheet/runtime.js @@ -359,6 +359,22 @@ function averageIf(condition, cells) { return sumAndCount[0] / sumAndCount[1]; } +function maxIf(condition, cells) { + return Math.max(...numericResolve(cells).filter(condition)); +} + +function max(cells) { + return maxIf(() => true, cells); +} + +function minIf(condition, cells) { + return Math.min(...numericResolve(cells).filter(condition)); +} + +function min(cells) { + return minIf(() => true, cells); +} + function median(cells) { const values = numericResolve(cells); @@ -713,6 +729,48 @@ averageIf.__documentation = JSON.stringify({ }, }); +max.__documentation = JSON.stringify({ + name: "max", + argc: 1, + argnames: ["the range"], + doc: "Gets the largest cell's value in the range", + examples: { + "max(R`A1:C4`)": "Finds the largest number within A1:C4", + }, +}); + +maxIf.__documentation = JSON.stringify({ + name: "max", + argc: 1, + argnames: ["condition", "the range"], + doc: "Gets the largest cell's value in the range which evaluates to true when passed to `condition`", + examples: { + "maxIf(x => x > 4, R`A1:C4`)": + "Finds the largest number within A1:C4 that is greater than 4", + }, +}); + +min.__documentation = JSON.stringify({ + name: "min", + argc: 1, + argnames: ["the range"], + doc: "Gets the smallest cell's value in the range", + examples: { + "min(R`A1:C4`)": "Finds the smallest number within A1:C4", + }, +}); + +minIf.__documentation = JSON.stringify({ + name: "min", + argc: 1, + argnames: ["condition", "the range"], + doc: "Gets the smallest cell's value in the range which evaluates to true when passed to `condition`", + examples: { + "minIf(x => x > 4, R`A1:C4`)": + "Finds the smallest number within A1:C4 that is greater than 4", + }, +}); + median.__documentation = JSON.stringify({ name: "median", argc: 1, diff --git a/Userland/Applications/Spreadsheet/Tests/free-functions.js b/Userland/Applications/Spreadsheet/Tests/free-functions.js index 80cc1b59f7..dbc7de1220 100644 --- a/Userland/Applications/Spreadsheet/Tests/free-functions.js +++ b/Userland/Applications/Spreadsheet/Tests/free-functions.js @@ -73,6 +73,7 @@ describe("Statistics", () => { sheet.makeCurrent(); for (let i = 0; i < 10; ++i) sheet.setCell("A", i, `${i}`); + for (let i = 0; i < 10; ++i) sheet.setCell("B", i, `${i * i}`); test("sum", () => { expect(sum).toBeDefined(); @@ -104,6 +105,26 @@ describe("Statistics", () => { expect(averageIf(x => !Number.isNaN(x), R`A0:A10`)).toEqual(4.5); }); + test("minIf", () => { + expect(minIf).toBeDefined(); + expect(minIf(x => x > 25, R`B0:B9`)).toEqual(36); + }); + + test("min", () => { + expect(min).toBeDefined(); + expect(min(R`B0:B9`)).toEqual(0); + }); + + test("maxIf", () => { + expect(maxIf).toBeDefined(); + expect(maxIf(x => x > 25, R`B0:B9`)).toEqual(81); + }); + + test("max", () => { + expect(max).toBeDefined(); + expect(max(R`B0:B9`)).toEqual(81); + }); + test("median", () => { expect(median).toBeDefined(); expect(median(R`A0:A9`)).toEqual(4.5); |