【问题标题】:loop over an object and return lowest number in javascript循环一个对象并在javascript中返回最小的数字
【发布时间】:2014-01-11 05:29:41
【问题描述】:

所以我是一个 JS 新手,正在尝试找出如何解决我的问题。我正在尝试遍历一个对象并返回最小的数字。

在我的var shortest = ; 中,如果我硬编码一个数字,比如var shortest = 455;,那么问题会返回正确的数字 3。虽然我不确定在默认情况下该放什么以使其空白。我试过object[0]object[key]'',但这些都不能正常工作

var myObj = {first: 45, second: 23, third: 3, fourth: 222, fifth: 2343};

var myFunc = function (object) {
    var shortest = ;
    for (var key in object) {
      if (object[key] < shortest) {
        shortest = object[key];
      }
    }; 
    return shortest;
};

【问题讨论】:

  • 输入一个非常大的数字怎么样? Infinity 怎么样?这个问题看起来很像你之前的问题。这些是作业题吗?
  • 他们是,只是我试图学习这种可爱的语言时遇到的问题 :) 我可以对数字进行硬编码,但这在现实世界中行不通,所以试着了解正确的做法是的。
  • 为什么它在现实世界中不起作用?

标签: javascript object for-in-loop


【解决方案1】:

将 shortest 的初始值设置为 Number.MAX_VALUE 即可

var myObj = {first: 45, second: 23, third: 3, fourth: 222, fifth: 2343};

var myFunc = function (object) {
    var shortest = Number.MAX_VALUE;
    for (var key in object) {
      if (object[key] < shortest) {
        shortest = object[key];
      }
    }; 
    return shortest;
};

数字.MAX_VALUE 可表示的最大正数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

【讨论】:

  • +1 用于实际回答问题。更多帮助是指出当 x 未定义时,x &lt; anyNumber 的结果始终为 false(请参阅 The Abstract Relational Comparison Algorithm),因为 undefined 将被转换为NaN.
  • 感谢您的反馈。忘记处理 undefined 是常见的错误来源 :)
  • 感谢这帮了大忙。我阅读了 MDN 文档,MIN_value 是什么意思,正如它所说的 Number.MIN_VALUEThe smallest positive representable number - that is, the positive number closest to zero (without actually being zero).,我真的不明白。我针对我的代码运行它,它在控制台中返回了5e-324
  • @jstone 5e-324 是一个浮点数:5 乘以 0.1 324 次,例如:0.000000005 你可以在这里阅读详细信息developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
【解决方案2】:

试试这个:

var myObj = {first: 45, second: 23, third: 3, fourth: 222, fifth: 2343};

    var myFunc = function (object) {
        var shortest = object.first;
        for (var key in object) {
          if (object[key] < shortest) {
            shortest = object[key];
          }
        }; 
        return shortest;
    };

【讨论】:

  • 鉴于用例,假设有一个名为 first 的密钥是不安全的。
  • 你真的不想硬编码一个属性。要采用这种方法,您需要在循环的第一次迭代中初始化变量,或者使用标志,或者检查 shortest 中的 undefined
  • 您不应依赖将 shortest 设置为某个随机值。如果object.first === NaNundefined 怎么办?另外,请解释答案,而不是简单地发布代码。
  • 对不起我的英语!但我只是关注 OP 问题。我认为在这种情况下,第一个密钥必须是有效的。这不是随机密钥,对吧?
【解决方案3】:

失败的原因在这里:

var myFunc = function (object) {
    var shortest = ;
    for (var key in object) {
      if (object[key] < shortest) {

由于shortest的值为undefined&lt;操作符将其转换为NaN进行测试,并根据@的规则987654321@,将任何内容与NaN 组合返回未定义,相当于此处的false

解决方法是将 shortest 初始化为某个值,例如正如 qiu-deqing 建议的 Number.MAX_VALUE,或者你可以使用类似的东西:

function getShortest(object) {
    var shortest, value;

    for (var key in object) {
      value = object[key];

      if (typeof value == 'number' && !isNaN(value)) {

        if (typeof shortest != 'number') {
          shortest = value;
        } else {
          if (value < shortest) {
            shortest = value;
          }
        }
      }
    }
    return shortest;
}

以上将确保您只比较数字,并且 shortest 将只是一个数字或 undefined。也应该有一个 hasOwnProperty 测试以避免继承属性。

【讨论】:

    【解决方案4】:

    看看这是否有帮助:

    var lowest = function(ns) {
      return Math.min.apply(0, ns);
    };
    
    var values = function(obj) {
      var result = [];
      for (var i in obj) {
        result.push(obj[i]);
      }
      return result;
    };
    
    var result = lowest(values(myObj));
    
    console.log(result); //=> 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2013-03-11
      • 2016-07-08
      • 2018-01-04
      相关资源
      最近更新 更多