Подтвердить что ты не робот

Получить ключ с минимальным значением

У меня есть такой массив: arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49, …}

И я пытаюсь получить наименьшее значение с ключом, используя Javascript.

Что я пробовал:

alert(Math.min.apply(Math, arr)); возвращает Infinity я не знаю почему

Я получил это в Google, просто для попытки:

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

возвращает Infinity тоже

Я хочу что-то более полное, как этот вывод: "Наименьшее значение 2 из lst9".

Я действительно пытался исправить это сам, прежде чем спрашивать здесь, но безуспешно! Можете ли вы помочь мне решить эту проблему "Бесконечность"? Спасибо.

4b9b3361

Ответ 1

Вы можете получить ключ и значение, используя 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);

Ответ 2

Есть несколько способов достичь того, что вы хотите. Пожалуйста, смотрите следующие методы:

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

Ответ 3

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

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

Ответ 4

Чтобы получить только минимальное число, вы можете использовать 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);

Ответ 5

Здесь мы сначала предполагаем, что min, key и value являются первым свойством и значением соответственно. Затем мы перебираем все элементы и сравниваем с minValue, чтобы найти любое значение меньше значения в объекте. Если это так, то мы обновляем как minValue, так и minKey. Во всяком случае, тип arr является объектом. это не массив в 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;
        }
    }
}

Ответ 6

Вы можете попробовать это:

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

Ответ 7

Вы можете попробовать это:

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

Скрипка: https://jsfiddle.net/ozvubmdr/

Ответ 8

Легко, хотя и не оптимально, так как он проходит через массив дважды: найдите наименьшее значение, а затем найдите принадлежащий ему ключ.

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

Ответ 9

Вы можете использовать Object.entries и Array.reduce чтобы уменьшить получающуюся пару [ключ-значение] до объекта, который будет иметь наименьшую запись:

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

Ответ 10

Вы можете использовать Object.entries и Array.reduce чтобы отслеживать минимальную пару на ходу:

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