【问题标题】:Get key with minimum value获取最小值的键
【发布时间】:2019-03-25 06:44:09
【问题描述】:

我有一个这样的数组: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

我想要更完整的东西,比如这个输出:“The minimum value is 2 from lst9”。

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

【问题讨论】:

  • 如果obj.lst3 是最小值,您是否要获取例如lst3
  • 另外,lst9 是什么?是lst9: 2吗?
  • 为此写下一个 for 循环。你也可以使用 for 循环来迭代对象。
  • arr 不是数组而是object

标签: javascript arrays object


【解决方案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);

【讨论】:

  • 你好,有没有办法让这个脚本也与 Internet Explorer 兼容?
  • 我试过了,但我在var lowestItems = Object.entries(arr).sort(([ ,v1], [ ,v2]) => v1 - v2)[0]线上遇到了语法错误
  • @Mernt IE 不支持粗箭头表示法。您需要用旧式 Javascript 重写 ([ ,v1], [ ,v2]) => v1 - v2
  • 好的答案,但使用Array.prototype.reduce() 而不是Array.prototype.sort() 会更高效.. 而且,如果对象arr 不包含任何键值对,您也不会阻止..跨度>
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    有几种方法可以实现您想要的。请看以下方法:

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

    【讨论】:

    • var key = Object.keys(arr).filter(x =&gt; arr[x] === lowest)[0] 行语法错误
    • 如果在 IE 中不起作用,我会建议使用 polyfill。见这里:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 我还应该告诉你,在我的 Windows 10 上的 IE 上它不需要 polyfill 就可以工作。
    • @JohnKennedy 对此我感到很惊讶,IE 不支持箭头功能
    【解决方案4】:

    要获得最小数量,您可以使用Math.min(...Object.entries(arr).map(o =&gt; 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]) =&gt; a[Object.keys(a)[0]] &lt; 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】:

      这里我们首先假设min、key和value分别作为first属性和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】:

        你可以试试这个:

        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/

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            你可以试试这个:

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

            【讨论】:

              【解决方案9】:

              您可以使用 Object.entriesArray.reduce 将生成的 [key-value] 对减少为具有最低条目的对象:

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

                【讨论】:

                  猜你喜欢
                  • 2011-02-16
                  • 2014-07-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-03-08
                  • 2021-12-11
                  • 2020-06-26
                  • 2021-12-06
                  相关资源
                  最近更新 更多