-2
votes

Utilisation de JavaScript pour isoler un objet avec une propriété supérieure à une quantité donnée, mais plus petit que l'objet suivant en séquence

Dans mon javascript, j'ai un entier qui représente une quantité de commande et un objet de toutes les quantités proposées: xxx

J'ai besoin de trouver l'objet avec une valeur de quantité supérieure à ma commande Quantité, mais plus petite que la valeur de quantité de l'objet suivant dans la séquence.

Par exemple, si ma quantité de commande est 8, j'ai besoin d'isoler: xxx

afin que je puisse obtenir le prix correct. J'ai essayé diverses méthodes de lodash, mais rien ne semble être tout à fait juste. Y a-t-il une façon de pouvoir y parvenir?


5 commentaires

Vous n'avez pas de tableau là-bas, vous avez un objet. Donc, aucune des méthodes de tableau ne va fonctionner.


"mais plus petit que la valeur de la quantité du tableau suivant de la séquence" qu'entendez-vous par là?


Si la liste réelle est petite, la méthode la plus simple est probablement juste une boucle naïve. Itérer à travers chaque article et trouver le meilleur match. Si votre jeu de données réel est suffisamment grand pour que cela soit un problème de performance (improbable), peut-être convertir à un tableau et faire une recherche binaire de la meilleure valeur ..


@alttag "Itèchez à travers chaque article et trouvez le meilleur match." <- Je pense que c'est ce que l'OP demande comment faire.


La clé reflète-t-elle la quantité?


4 Réponses :


0
votes

Basé sur votre description, je suppose que ce que vous essayez de faire est de trouver l'enregistrement correspondant à la quantité la plus basse supérieure à la quantité d'entrée. L'exemple ne correspond pas à cette description cependant. Si vous recherchez le contraire (le plus important, plus petit que l'entrée), vous pouvez retourner les deux inégalités.

p>

    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)));


0 commentaires

0
votes

Vous pouvez prendre les clés et inverser le tableau et trouver le nombre plus petit ou égal.

p>

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));


1 commentaires

Même si cela devrait fonctionner par la spécification, cela dépend du fait laid du fait que "12" <8 // => false même si "12" <"8" // => vrai . Selon ce type de coercition, vous m'inquiènerait. Je pense qu'il est préférable de travailler directement avec les valeurs numériques, d'autant plus que la sortie demandée les inclut.




0
votes

Comme les autres réponses, je trouve la meilleure façon de gérer la question de base consiste à inverser la liste. Mais plutôt que dépend de l'objet d'origine commandé comme vous le souhaitez, je pense qu'il est préférable de le trier à l'avant, puis nous pouvons simplement le faire dans l'ordre inverse.

p>

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 commentaires