web-dev-qa-db-fra.com

Obtenez la clé avec une valeur minimale

J'ai un tableau comme celui-ci: arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49, …}

Et j'essaye d'obtenir la valeur la plus basse avec la clé en utilisant Javascript.

Ce que j'ai essayé:

alert(Math.min.apply(Math, arr)); renvoie Infinity je ne sais pas pourquoi

Je l'ai obtenu sur Google, juste pour essayer:

var keys = Object.keys(arr).map(Number).filter(function(a){
    return arr[a];
}); alert(Math.min.apply(Math, keys));

renvoie également Infinity

Je veux quelque chose de plus complet, comme cette sortie: "La valeur la plus basse est 2 de lst9".

J'ai vraiment essayé de le réparer moi-même avant de demander ici, mais sans succès! Pouvez-vous m'aider à résoudre ce problème "Infinity"? Je vous remercie.

18
Mernt

Vous pouvez obtenir la clé et la valeur en utilisant Object.entries:

var arr = {
  lst1: 300,
  lst2: 381,
  lst3: 4,
  lst4: 4,
  lst5: 49
};

function lowestValueAndKey(obj) {
  var [lowestItems] = Object.entries(obj).sort(([ ,v1], [ ,v2]) => v1 - v2);
  return `Lowest value is ${lowestItems[1]}, with a key of ${lowestItems[0]}`;
}

var lowest = lowestValueAndKey(arr);
console.log(lowest);
16
Jack Bashford

Il y a plusieurs façons d'arriver à ce que vous voulez. Veuillez consulter les méthodes suivantes:

const obj = { lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49 }
const values = Object.values(obj)
const lowest = Math.min.apply(null, values)

// Using Object.keys(), Object.values() and findIndex()
const keys = Object.keys(obj)
const indexOfLowest = values.findIndex(function (x) { return x === lowest })
console.log(`The lowest value is ${lowest} from ${keys[indexOfLowest]}`)



// OR Using Object.keys() and filter()
const key = Object.keys(obj).filter(function (x) { return obj[x] === lowest })[0]
console.log(`The lowest value is ${lowest} from ${key}`)



// OR Using Object.entries() and sort()
const [[lowestKey, lowestVal]] = Object.entries(obj).sort(function ([,valA], [,valB]) { return valA - valB });
console.log(`The lowest value is ${lowestVal} from ${lowestKey}`)
9
John Kennedy

Il existe de nombreuses façons d'aborder votre problème, mais voici une autre façon simple de le faire. Fondamentalement, c'est une manière de faire les choses par force brute, par laquelle vous parcourez chaque propriété pour vérifier la valeur.

const obj = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49};

const getSmallest = function (object) {
  let smallestValue = Number.MAX_VALUE;
  let selectedKey = '';
  for (let key in object) {
    if (object[key] < smallestValue) {
      smallestValue = object[key];
      selectedKey = key;
    }
  }; 
  console.log(selectedKey, smallestValue)
  return `The lowest value is ${smallestValue} from ${selectedKey}`;
};

getSmallest(obj);
9
user10997785

Pour obtenir uniquement le nombre minimum, vous pouvez utiliser Math.min(...Object.entries(arr).map(o => o[1])):

const arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49};
const lowestValue = Math.min(...Object.entries(arr).map(o => o[1]));

console.log(lowestValue);

Et pour obtenir l'objet avec la valeur minimale, vous pouvez utiliser Object.entries(arr).reduce((a, [k, v]) => a[Object.keys(a)[0]] < v ? a : {[k]: v}, {}):

const arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49};
const lowestObj = Object.entries(arr).reduce((a, [k, v]) => a[Object.keys(a)[0]] < v ? a : {[k]: v}, {});

console.log(lowestObj);
5
Yosvel Quintero

Ici, nous supposons d'abord que le min, la clé et la valeur sont respectivement la première propriété et la valeur. Ensuite, nous parcourons tous les éléments et comparons avec minValue pour trouver une valeur inférieure à celle de l'objet. Si c'est le cas, nous mettons à jour à la fois minValue et minKey. Quoi qu'il en soit, le type arr est un objet. ce n'est pas un tableau en javascript.

var arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49};
var minkey = Object.keys(arr)[0];
var minValue = arr[Object.keys(arr)[0]];
for (var key in arr) {
    if (arr.hasOwnProperty(key)) {
        if(arr[key] < minValue){
           minValue = arr[key];
           minKey = key;
        }
    }
}
4
Harshana

Vous pouvez essayer ceci:

const arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49, lst9: 2}
const minVal = Math.min(...Object.values(arr))
const fromKey = Object.keys(arr).find(key => arr[key] === minVal)
console.log(`The lowest value is ${minVal} from ${fromKey}`)
3
Pak Wah Wong

Vous pouvez utiliser Object.entries et utilise Array.reduce pour réduire la paire [valeur-clé] résultante en un objet dont l'entrée sera la plus faible:

const data = {lst1: 300, lst2: -381, lst3: 4, lst4: 4, lst5: 49, lst6: -49, lst7: 0, lst7: 78, lst7: -90};
const obj = Object.entries(data).reduce((acc, [key, value]) =>{
  acc["lowest"] = acc["lowest"] ?  Object.values(acc["lowest"])[0] < value ? acc["lowest"] : {[key] : value} : {[key] : value };
  return acc;
}, {});
console.log(`Lowest value is found in  ${JSON.stringify(obj.lowest)}`);
2
Fullstack Guy

Vous pouvez essayer ceci:

obj = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49, lst9: 2}; // This is an object, That;s ehy you getting infinite

var arr = Object.keys( obj ).map(function ( key ) { return obj[key]; });

alert(Math.min.apply( null, arr ));

Violon: https://jsfiddle.net/ozvubmdr/

2
Ajay Makwana

Facile, mais pas optimal, car il parcourt le tableau deux fois: trouvez la plus petite valeur, puis trouvez la clé qui lui appartient.

arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49, lst9: 2}
min = Math.min(...Object.values(arr));
minkey = Object.keys(arr).find(key => arr[key] = min);
console.log(`Lowest is ${min} at ${minkey}`);
2
Amadan

Vous pouvez utiliser Object.entries et Array.reduce pour garder une trace de la paire minimale au fur et à mesure:

const findKeyForMin = obj => Object.entries(obj).reduce(([accKey, accVal], [curKey, curVal]) =>
    /* Change `<` to `<=` to find the last minimum instead of the first minimum. */
    curVal < accVal ? [curKey, curVal] : [accKey, accVal]
)[0];
0
Solomon Ucko