зациклиться на объекте и вернуть наименьшее число в javascript

Итак, я новичок в 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;
};

person jstone    schedule 23.12.2013    source источник
comment
Как насчет того, чтобы поставить действительно большое число? Как насчет Infinity? Этот вопрос очень похож на ваш предыдущий. Это домашние задания?   -  person cookie monster    schedule 23.12.2013
comment
Это просто проблемы, которые я создаю, пытаясь выучить этот прекрасный язык :) Я мог бы жестко закодировать число, но это не работает в реальном мире, поэтому я пытаюсь понять, как это сделать правильно.   -  person jstone    schedule 23.12.2013
comment
Почему это не работает в реальном мире?   -  person cookie monster    schedule 23.12.2013


Ответы (4)


установите начальное значение кратчайшего в 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

person qiu-deqing    schedule 23.12.2013
comment
+1 за фактический ответ на вопрос. Еще немного поможет указание на то, что когда x не определено, результат x < anyNumber всегда равен false (см. Алгоритм абстрактного реляционного сравнения), так как undefined будет преобразовано в NaN. - person RobG; 23.12.2013
comment
Спасибо за ваш отзыв. забыть обработать undefined — распространенный источник ошибок :) - person qiu-deqing; 23.12.2013
comment
Спасибо, это очень помогло. Я прочитал документ MDN и что означает MIN_value, как он сказал Number.MIN_VALUEThe smallest positive representable number - that is, the positive number closest to zero (without actually being zero)., и я действительно не понимаю. Я запустил его со своим кодом, и он вернул 5e-324 в консоли. - person jstone; 23.12.2013
comment
@jstone 5e-324 — это число с плавающей запятой: 5 умножить на 0,1 324 раза, например: 0,000000005, вы можете прочитать подробности здесь developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/ - person qiu-deqing; 23.12.2013

Попробуй это:

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;
    };
person Ringo    schedule 23.12.2013
comment
Учитывая вариант использования, небезопасно предполагать, что существует ключ с именем first. - person loganfsmyth; 23.12.2013
comment
Вы действительно не хотите жестко кодировать свойство. Чтобы использовать этот подход, вам нужно будет инициализировать переменную в первой итерации цикла либо с помощью флага, либо путем проверки shortest на undefined. - person cookie monster; 23.12.2013
comment
Вы не должны полагаться на установку shortest на какое-то случайное значение. А если object.first === NaN или undefined? Кроме того, пожалуйста, объясните ответы, а не просто публикуйте код. - person RobG; 23.12.2013
comment
Извините за мой английский! Но я просто следую вопросу ОП. Я думаю, что первый ключ должен быть действительным в этом случае. Это не случайный ключ, верно? - person Ringo; 23.12.2013

Причина, по которой это не удается, находится здесь:

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

Поскольку значение кратчайшего не определено, оператор < приводит к тому, что оно преобразуется в NaN для теста и в соответствии с правилами для Алгоритм абстрактного реляционного сравнения, сопоставление чего-либо с NaN возвращает undefined, что эквивалентно 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;
}

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

person RobG    schedule 23.12.2013

Посмотрите, поможет ли это:

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
person elclanrs    schedule 23.12.2013