135 votes

Comparez un tableau d'objets JavaScript pour obtenir le minimum et le maximum.

J'ai un tableau d'objets et je veux comparer ces objets sur une propriété spécifique de l'objet. Voici mon tableau :

var myArray = [
    {"ID": 1, "Cost": 200},
    {"ID": 2, "Cost": 1000},
    {"ID": 3, "Cost": 50},
    {"ID": 4, "Cost": 500}
]

Je voudrais me concentrer sur le "coût" spécifiquement et obtenir une valeur minimale et maximale. Je me rends compte que je peux simplement récupérer les valeurs de coût et les placer dans un tableau javascript, puis exécuter la fonction JavaScript rapide Max/Min .

Cependant, existe-t-il un moyen plus simple de le faire en contournant l'étape du tableau au milieu et en utilisant directement les propriétés de l'objet (dans ce cas, "Coût") ?

230voto

Tristan Reid Points 386

La réduction est utile pour ce genre de choses : pour effectuer des opérations d'agrégation (comme min, max, moyenne, etc.) sur un tableau d'objets, et renvoyer un seul résultat :

myArray.reduce(function(prev, curr) {
    return prev.Cost < curr.Cost ? prev : curr;
});

...ou vous pouvez définir cette fonction interne avec la syntaxe de fonction ES6 :

(prev, curr) => prev.Cost < curr.Cost ? prev : curr

Si vous voulez être mignon, vous pouvez attacher ça au tableau :

Array.prototype.hasMin = function(attrib) {
    return (this.length && this.reduce(function(prev, curr){ 
        return prev[attrib] < curr[attrib] ? prev : curr; 
    })) || null;
 }

Maintenant tu peux juste dire :

myArray.hasMin('ID')  // result:  {"ID": 1, "Cost": 200}
myArray.hasMin('Cost')    // result: {"ID": 3, "Cost": 50}
myEmptyArray.hasMin('ID')   // result: null

Veuillez noter que si vous avez l'intention de l'utiliser, il ne comporte pas de contrôles complets pour toutes les situations. Si vous passez un tableau de types primitifs, il échouera. Si vous vérifiez une propriété qui n'existe pas, ou si tous les objets ne contiennent pas cette propriété, vous obtiendrez le dernier élément. Cette version est un peu plus volumineuse, mais elle comporte ces vérifications :

Array.prototype.hasMin = function(attrib) {
    const checker = (o, i) => typeof(o) === 'object' && o[i]
    return (this.length && this.reduce(function(prev, curr){
        const prevOk = checker(prev, attrib);
        const currOk = checker(curr, attrib);
        if (!prevOk && !currOk) return {};
        if (!prevOk) return curr;
        if (!currOk) return prev;
        return prev[attrib] < curr[attrib] ? prev : curr; 
    })) || null;
 }

65voto

Rob W Points 125904

Une façon de procéder consiste à parcourir en boucle tous les éléments et à les comparer à la valeur la plus élevée/la plus basse.

(La création d'un tableau, l'invocation de méthodes de tableau sont excessives pour cette simple opération).

 // There's no real number bigger than plus Infinity
var lowest = Number.POSITIVE_INFINITY;
var highest = Number.NEGATIVE_INFINITY;
var tmp;
for (var i=myArray.length-1; i>=0; i--) {
    tmp = myArray[i].Cost;
    if (tmp < lowest) lowest = tmp;
    if (tmp > highest) highest = tmp;
}
console.log(highest, lowest);

32voto

katspaugh Points 6110

Utilice sort si vous ne vous souciez pas de la modification du tableau.

myArray.sort(function (a, b) {
    return a.Cost - b.Cost
})

var min = myArray[0],
    max = myArray[myArray.length - 1]

29voto

Rupert Points 1498

Utilice Math et extraire les valeurs que vous voulez avec la fonction map .

Voici le jsbin :

https://jsbin.com/necosu/1/edit?js,console

var myArray = [{
    "ID": 1,
    "Cost": 200
  }, {
    "ID": 2,
    "Cost": 1000
  }, {
    "ID": 3,
    "Cost": 50
  }, {
    "ID": 4,
    "Cost": 500
  }],

  min = Math.min.apply(null, myArray.map(function(item) {
    return item.Cost;
  })),
  max = Math.max.apply(null, myArray.map(function(item) {
    return item.Cost;
  }));

console.log('min', min);//50
console.log('max', max);//1000

UPDATE :

Si vous voulez utiliser ES6 :

var min = Math.min.apply(null, myArray.map(item => item.Cost)),
    max = Math.max.apply(null, myArray.map(item => item.Cost));

27voto

JuZDePeche Points 85

Utilisation de Math.min y Math.max :

var myArray = [
    { id: 1, cost: 200},
    { id: 2, cost: 1000},
    { id: 3, cost: 50},
    { id: 4, cost: 500}
]

var min = Math.min(...myArray.map(item => item.cost));
var max = Math.max(...myArray.map(item => item.cost));

console.log("min: " + min);
console.log("max: " + max);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X