Я хочу написать алгоритм нумерации страниц, который равномерно распределяет количество элементов на страницу с указанием минимального и максимального количества элементов на странице. По возможности, я хотел иметь максимальное количество элементов на странице, которое она может иметь, не нарушая правила минимума.
Я пытался написать свою собственную версию этого в течение некоторого времени, но я застрял когда дело доходит до распределения элементов на странице способом, который я считаю эстетически приятным. Вот код моих тестов:
describe('paginate()', () => {
it('puts everything on one page is less than or equal to maximum', () => {
expect(paginate([1, 2], 1, 8)).toEqual([[1, 2]]);
expect(paginate([1, 2], 3, 8)).toEqual([[1, 2]]);
expect(paginate([1, 2], 1, 2)).toEqual([[1, 2]]);
});
it('divides everything evenly if there are no remainders on the max', () => {
expect(paginate([1, 2, 3, 4, 5, 6], 1, 3)).toEqual([
[1, 2, 3],
[4, 5, 6],
]);
expect(paginate([1, 2, 3, 4, 5, 6], 1, 2)).toEqual([
[1, 2],
[3, 4],
[5, 6],
]);
});
it('merges the last page if there is one left over', () => {
let outcome = paginate([1, 2, 3, 4, 5, 6, 7], 2, 4);
expect(outcome).toEqual([
[1, 2, 3, 4],
[5, 6, 7],
]);
outcome = paginate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2, 4);
console.log('outcome', outcome);
expect(outcome).toEqual([
[1, 2, 3, 4],
[5, 6, 7],
[8, 9, 10],
]); // THIS TEST FAILS
});
it('can reduce page sizes if it makes elements evenly distributed', () => {
let outcome = paginate(_.range(1, 12), 6, 10);
expect(outcome).toEqual(
[
[1, 2, 3, 4, 5, 6],
[7, 8, 9, 10, 11],
],
JSON.stringify(outcome)
);
outcome = paginate(_.range(1, 22), 6, 10);
expect(outcome).toEqual(
[
[1, 2, 3, 4, 5, 6, 7],
[8, 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 20, 21],
],
JSON.stringify(outcome)
);
});
});
Вот мой код:
import _ from 'lodash';
export const paginate = <T>(content: T[], min: number, max: number): T[][] => {
const length = content.length;
for (let i = max; i > min; i--) {
if (length % i === 0 || length % i >= min) {
const result = _.chunk(content, i);
console.log(result);
return result;
}
}
console.log('end');
return _.chunk(content, min);
};
здесь не работает только один из моих тестов, но я не знаю, как его пройти :
outcome = paginate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2, 4);
console.log('outcome', outcome);
expect(outcome).toEqual([
[1, 2, 3, 4],
[5, 6, 7],
[8, 9, 10],
]); // THIS TEST FAILS
вывод [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ], [ 9, 10 ] ]
вместо того, что я хочу. Каждый раз, когда я думаю о решении этой проблемы, это срывает очередной тест. Я работаю уже несколько часов и застрял. Я не знаю, как пройти все эти тесты. Кроме того, есть ли какие-то крайние случаи, о которых я, возможно, не подумал?
Я не привязан к подписи I ' мы придумали для этой функции, поэтому, если есть смысл изменить ее, не стесняйтесь. Например, я не совсем уверен, что мне вообще нужно предоставлять минимум.