mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 20:07:36 +00:00
Spreadsheet: Add max(If)/min(If) function for ranges
This commit is contained in:
parent
6c35419236
commit
99425c5adc
2 changed files with 79 additions and 0 deletions
|
@ -359,6 +359,22 @@ function averageIf(condition, cells) {
|
||||||
return sumAndCount[0] / sumAndCount[1];
|
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) {
|
function median(cells) {
|
||||||
const values = numericResolve(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({
|
median.__documentation = JSON.stringify({
|
||||||
name: "median",
|
name: "median",
|
||||||
argc: 1,
|
argc: 1,
|
||||||
|
|
|
@ -73,6 +73,7 @@ describe("Statistics", () => {
|
||||||
sheet.makeCurrent();
|
sheet.makeCurrent();
|
||||||
|
|
||||||
for (let i = 0; i < 10; ++i) sheet.setCell("A", i, `${i}`);
|
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", () => {
|
test("sum", () => {
|
||||||
expect(sum).toBeDefined();
|
expect(sum).toBeDefined();
|
||||||
|
@ -104,6 +105,26 @@ describe("Statistics", () => {
|
||||||
expect(averageIf(x => !Number.isNaN(x), R`A0:A10`)).toEqual(4.5);
|
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", () => {
|
test("median", () => {
|
||||||
expect(median).toBeDefined();
|
expect(median).toBeDefined();
|
||||||
expect(median(R`A0:A9`)).toEqual(4.5);
|
expect(median(R`A0:A9`)).toEqual(4.5);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue