Anopeng
@Anopeng
Веб-программист, учу фронт и бек

Как можно улучшить этот код?

function range(a, b, step = 1) {
	if (b == undefined) [a, b] = [0, a];
	
	let arr = [];
	for (let i = a; step > 0 ? i < b : i > b; i += step) arr.push(i);
	
	return arr;
}
class Counter {
	$ = 0n;
	constructor(params) {
		this.min = params.min || 0;
		this.max = params.max || 9;
		this.len = params.len || 0;
		
		this.radix = BigInt(this.max - this.min + 1);
		
		if (params.$) {
			this.$ = BigInt(params.$);
			return;
		}
		if (params.inv) {
			this.$ = this.radix ** BigInt(this.len) - 1n;
		}
	}
	get() {
		let arr = [];
		let lastMul = this.$;
		for (let i of range(this.len)) {
			let mul = ~~(lastMul / this.radix);
			arr.unshift(Number((lastMul - mul * this.radix) + BigInt(this.min)));
			lastMul = mul;
		}
		return arr;
	}
}
window.onload = function () {
	let counter = new Counter({ max: 9, len: 3, inv: true });
	console.log(counter.get());
	
	counter.$++;
	console.log(counter.get());
	 
	counter.$ += 85n;
	console.log(counter.get());
}


P.S. для переменной $ использую BigInt, потому что в случае большого количества разрядов и основания счисления, она может стать Infinity
  • Вопрос задан
  • 81 просмотр
Решения вопроса 2
RAX7
@RAX7
Можно для функции range использовать генератор, в этом случае не будет выделятся память под ненужный массив
function* range(from, to, step = 1) {
  if (to === undefined) [from, to] = [0, from];
  for (let i = from; i < to; i += step) yield i;
}

for (let v of range(1, 10)) {
  console.log(v);
}
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Да много чего можно улучшить. Например, выкинуть на помойку идиотский range() и вместо него использовать обычный цикл, причем в обратном направлении, чтобы заменить unshift на push.
Вместо counter.$ просто добавит параметр в counter.get()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы