Получить ключ с минимальным значением - PullRequest
18 голосов
/ 25 марта 2019

У меня есть такой массив: 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».

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

Ответы [ 10 ]

16 голосов
/ 25 марта 2019

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

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

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 голосов
/ 25 марта 2019

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

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}`)
5 голосов
/ 25 марта 2019

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

А чтобы получить объект с минимальным значением, вы можете использовать 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);
4 голосов
/ 25 марта 2019

Здесь мы сначала предполагаем, что 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;
        }
    }
}
3 голосов
/ 25 марта 2019

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

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}`)
2 голосов
/ 25 марта 2019

Вы можете использовать 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)}`);
2 голосов
/ 25 марта 2019

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

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 голосов
/ 25 марта 2019

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

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/

0 голосов
/ 08 мая 2019

Вы можете использовать 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...