Использование Javascript для изоляции объекта со свойством, которое больше заданного количества, но меньше, чем следующий объект в последовательности - PullRequest
0 голосов
/ 02 октября 2019

В моем JavaScript у меня есть целое число, которое представляет количество заказа, и объект всех предложенных количеств:

    {
        "1": {
            "quantity": 1,
            "price": 10
        },
        "2": {
            "quantity": 2,
            "price": 20
        },
        "6": {
            "quantity": 6,
            "price": 50
        },
        "12": {
            "quantity": 12,
            "price": 80
        }
    }

Мне нужно найти объект со значением количества, превышающим количество моего заказа,но меньше, чем значение количества следующего объекта в последовательности.

Например, если количество моего заказа 8, мне нужно выделить:

        "6": {
            "quantity": 6,
            "price": 50
        },

Таким образом, я могу получить правильныйцена. Я пробовал разные методы LoDash, но, похоже, все не совсем правильно. Есть ли способ, которым я могу этого достичь?

Ответы [ 4 ]

0 голосов
/ 02 октября 2019

Как и другие ответы, я считаю, что лучший способ справиться с основным вопросом - это перевернуть список. Но вместо того, чтобы упорядочивать исходный объект так, как вам нравится, я думаю, что лучше отсортировать его заранее, и тогда мы можем просто сделать это в обратном порядке.

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}
  }
}

Но лично мне было бы гораздо сложнее работать с этим форматом.

0 голосов
/ 02 октября 2019

Вы можете взять ключи и повернуть массив и найти меньшее или равное количество.

function find(object, quantity) {
    return Object.keys(object).reverse().find(v => v <= quantity);
}

var object = { 1: { quantity: 1, price: 10 }, 2: { quantity: 2, price: 20 }, 6: { quantity: 6, price: 50 }, 12: { quantity: 12, price: 80 } };

console.log(find(object, 8));
0 голосов
/ 02 октября 2019

Если вам просто нужно перебрать ключи в объекте Javascript, на этот ответили много раз .

var prices = {
        "1": {
            "quantity": 1,
            "price": 10
        },
        "2": {
            "quantity": 2,
            "price": 20
        },
        "6": {
            "quantity": 6,
            "price": 50
        },
        "12": {
            "quantity": 12,
            "price": 80
        }
    };

for (qty in prices) {
  // Do stuff
  console.log(qty);
}

Если вам просто нужно выявить доступные количества (вашключи объекта), используйте Object.keys(prices), который возвращает массив, который вы можете зациклить.

Как только данные окажутся в массиве, вы можете сделать еще один цикл for или начать фантазировать с forEach(), filter() и т. П.

0 голосов
/ 02 октября 2019

Исходя из вашего описания, я предполагаю, что вы пытаетесь найти запись, соответствующую наименьшему количеству, превышающему введенное количество. Пример на самом деле не соответствует этому описанию. Если вы ищете противоположность (следующий по величине, меньший, чем вход), вы можете перевернуть два неравенства.

    some_prices =  {
        "1": {
            "quantity": 1,
            "price": 10
        },
        "2": {
            "quantity": 2,
            "price": 20
        },
        "6": {
            "quantity": 6,
            "price": 50
        },
        "12": {
            "quantity": 12,
            "price": 80
        }
    }

    getNextQuantityPrice = (prices, quantity) => {
        const largerQuantities = Object.values(prices)
            .filter(value => value.quantity > quantity);
        if (largerQuantities.length === 0) return null;
        return largerQuantities
            .reduce((min, next) => next.quantity < min.quantity ? next : min)
    }

    console.log(JSON.stringify(getNextQuantityPrice(some_prices, 2)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...