Это было помечено рекурсией , и я думаю, что это полезный вызов. Рекурсивная версия этой функции с использованием деструктуризации и параметров по умолчанию оказывается довольно простой:
const calcPrice = ([[wb, rate, bp = Infinity], ...rates], weight = 0) =>
weight < bp
? rate * Math .max (wb, weight)
: calcPrice (rates, weight);
const rates = [[45, 3.8, 88], [100, 3.35, 296], [300, 3.3, 492], [500, 3.25]];
const vals = [33, 47, 85, 90, 103, 296, 297, 302, 490, 497, 2001]
vals .forEach (v => console .log (`${v} : ${calcPrice(rates, v).toFixed(2)}`))
Обратите внимание, что, задав для точки останова значение по умолчанию Infinity
, мы можем избежать специальной проверки существования третьей записи. Кроме того, лог c о том, как выполнять фактические вычисления, упрощен, поскольку мы должны сравнивать только с точкой останова, используя max
, чтобы выбрать значение, которое будет умножаться на нашу ставку. Итак, если вес меньше точки останова, мы можем вернуть rate * Math .max (wb, weight)
. Если это не так, мы повторяемся для оставшихся элементов нашего массива.
Кроме того, в вашем заголовке спрашивается об использовании оператора break
. Я думаю, ваш инстинкт верен; они должны быть довольно редкими. Обычно они указывают на код, который может хорошо справиться с серьезным рефакторингом. Помимо описанной выше рекурсивной техники, вы также можете управлять этим, используя что-то вроде const [wp, rate, bp = Infinity] = rates.find(([ , , bp]) => weight <= bp)
. Это также позволило бы избежать операторов break
, а также явного for
-l oop.
Update
Эта версия содержит гораздо больше исправлений ошибок за счет осторожного использования Параметры по умолчанию:
const calcPrice = (
[[weightbreak = 0, rate = 0, breakpoint = Infinity] = [0, 0, Infinity], ...rates] = [],
weight = 0
) =>
weight < breakpoint
? rate * Math .max (weightbreak, weight)
: calcPrice (rates, weight);
Он не выдаст ошибку, если массив rates
не существует, или если он пуст, или если некоторые значения отсутствуют. Вместо этого в большинстве случаев он вернет ноль. И он будет обрабатывать любые weight
, снова используя Infinity
для захвата больших значений, которые еще не совпали.