@EvgenyJozef3000

Как оптимизировать и сократить код?

Имеется следующий JS код.
if (floors.value == 1) {
	if (area.value <= 120) {
		a1 = 1.26;
	} else {
		a1 = 1; 
	}
	
	if (area.value >= 120.001 && area.value <= 140) {
		a2 = 1.24;
	} else {
		a2 = 1;
	}
	
	if (area.value >= 140.001 && area.value <= 160) {
		a3 = 1.23;
	} else {
		a3 = 1;
	}
	
	if (area.value >= 160.001 && area.value <= 200) {
		a4 = 1.22;
	} else {
		a4 = 1;
	}

	if (area.value >= 200.001 && area.value <= 260) {
		a5 = 1.2;
	} else {
		a5 = 1;
	}
	
	if (area.value >= 260.001 && area.value <= 300) {
		a6 = 1.19;
	} else {
		a6 = 1;
	}
	
	aF = a1*a2*a3*a4*a5*a6;
	console.log(aF);
} else if (floors.value == 2 || floors.value == 3) {
	if (area.value >= 100 && area.value <= 130) {
		b1 = 1.3;
	} else {
		b1 = 1;
	}
	
	if (area.value >= 130.001 && area.value <= 160) {
		b2 = 1.27;
	} else {
		b2 = 1;
	}
	
	if (area.value >= 160.001 && area.value <= 200) {
		b3 = 1.24;
	} else {
		b3 = 1;
	}
	
	if (area.value >= 200.001 && area.value <= 300) {
		b4 = 1.22;
	} else {
		b4 = 1;
	}
	
	bF = b1*b2*b3*b4;
	console.log(bF);
}

Как его оптимизировать и сократить?
  • Вопрос задан
  • 223 просмотра
Решения вопроса 3
sergiks
@sergiks Куратор тега JavaScript
♬♬
Описаны последовательные отрезки якобы непрерывного диапазона. Косяк в том, что для значений между, скажем, 120 и 120.001, условия не определены и код даст ошибку, т.к. не определится одна из переменных.

Поэтому лучше цепочка else if. Поскольку они перемножаются и по умолчанию единицы, можно сразу определять конечное значение:

if (floors.value == 1) {

  aF = 1; // по умолчанию, для больше 300
  
  if (area.value <= 120) aF = 1.26;
  else if (area.value <= 140) aF = 1.24;
  else if (area.value <= 160) aF = 1.23;
  else if (area.value <= 200) aF = 1.22;
  else if (area.value <= 260) aF = 1.2;
  else if (area.value <= 300) aF = 1.19;

  console.log(aF);
  
} else if (floors.value == 2 || floors.value == 3) {
  
  bF = 1; // ? для меньше 100 .. и больше 300
  
  if (area.value >= 100 && area.value <= 130) bF = 1.3;
  else if (area.value <= 160) bF = 1.27;
  else if (area.value <= 200) bF = 1.24;
  else if (area.value <= 300) bF = 1.22;

  console.log(bF);

}
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
const data = [
  {
    floors: [ 1 ],
    limits: [
      { f: 1.26, max: 120 },
      { f: 1.24, max: 140 },
      { f: 1.23, max: 160 },
      { f: 1.22, max: 200 },
      { f: 1.20, max: 260 },
      { f: 1.19, max: 300 },
    ],
  },
  {
    floors: [ 2, 3 ],
    limits: [
      { f: 1.00, max: 100, excludeMax: true },
      { f: 1.30, max: 130 },
      { f: 1.27, max: 160 },
      { f: 1.24, max: 200 },
      { f: 1.22, max: 300 },
    ],
  },
];

const d = data.find(n => n.floors.includes(floors.value));
if (d) {
  const v = area.value;
  console.log((d.limits.find(n => n.excludeMax ? n.max > v : n.max >= v) || { f: 1 }).f);
}
Ответ написан
Комментировать
@StockholmSyndrome
function isInInterval(start, end) {
  return area.value >= start && area.value <= end;
} 

const values = floors.value === 1 ? [
  [-Infinity, 120, 1.26], 
  [120.001, 140, 1.24], 
  [140.001, 160, 1.23], 
  [160.001, 200, 1.22], 
  [200.001, 260, 1.2], 
  [260.001, 300, 1.19]
] : floors.value === 2 || floors.value === 3 ? [
  [100, 130, 1.3], 
  [130.001, 160, 1.27], 
  [160.001, 200, 1.24], 
  [200.001, 300, 1.22]
] : [];

const [,, result] = values
  .find(([start, end]) => isInInterval(start, end)) || [,, 1];
console.log(result);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы