获取具有最小值的密钥



我有一个这样的数组:arr = {lst1: 300, lst2: 381, lst3: 4, lst4: 4, lst5: 49, …}

我正在尝试使用 Javascript 用键获取最低值。

我尝试过:

alert(Math.min.apply(Math, arr));返回Infinity我不知道为什么

我在谷歌上得到了这个,只是为了尝试:

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

也返回Infinity

我想要更完整的东西,比如这个输出:"最小值是 lst9 中的 2"。

在这里问之前,我真的尝试过自己修复它,但没有成功!你能帮我解决这个"无限"问题吗?谢谢。

您可以使用

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

有很多方法可以解决您的问题,但这里有一种简单的替代方法。基本上,这是一种蛮力做事的方式,通过它循环访问每个属性以检查值。

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

有几种方法可以达到你想要的。请参阅以下方法:

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

要仅获取您可以使用的最小数量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);

这里我们首先假设 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;
        }
    }
}

你可以试试这个:

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/

很简单,虽然不是最佳的,因为它遍历数组两次:找到最小的值,然后找到属于它的键。

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

你可以试试这个:

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

您可以使用

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

您可以使用

Object.entriesArray.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];

最新更新