Как и другие ответы, я считаю, что лучший способ справиться с основным вопросом - это перевернуть список. Но вместо того, чтобы упорядочивать исходный объект так, как вам нравится, я думаю, что лучше отсортировать его заранее, и тогда мы можем просто сделать это в обратном порядке.
const nextQuantity = (quantities) => {
const reversed = Object .values (quantities) .sort (({quantity: q1}, {quantity: q2}) => q2 - q1)
return (requested) => reversed .find (({quantity}) => quantity < requested)
}
const quantities = {1: {quantity: 1, price: 10}, 2: {quantity: 2, price: 20}, 6: {quantity: 6, price: 50}, 12: {quantity: 12, price: 80}}
console .log (
nextQuantity (quantities) (8)
)
Это также дает нам возможность сохранять промежуточную функцию, которой не требуется reverse
список при каждом вызове. nextQuantity(quantities)
возвращает функцию, которую вы можете вызывать повторно с каждым запрошенным количеством.
Если вам действительно нужен формат вывода из вопроса (то есть, не просто {quantity: 6, price: 50}
, а тот результат, заключенный в объект с одним свойствомкак {'6': {quantity: 6, price: 50}}
), тогда вы могли бы переписать его как
const nextQuantity = (quantities) => {
const reversed = Object .values (quantities) .sort (({quantity: q1}, {quantity: q2}) => q2 - q1)
return (requested) => {
const q = reversed .find (({quantity}) => quantity < requested)
return {[q.quantity]: q}
}
}
Но лично мне было бы гораздо сложнее работать с этим форматом.