最小值的几个值不能为0

时间:2015-07-05 17:14:40

标签: javascript ember.js

我需要至少abcd。但是当它们中的一个或多个为0时,它们就会脱离比较。我可以用if / else级联来解决这个问题,但这有点难看。有没有更清洁的方法来解决这个问题?单独Math.min不起作用,因为当其中一个变量为0时,它将导致0。

我可以将它们放在一个数组中并删除该数组中的所有0吗?数组有Math.min吗?

bestPrice: Ember.computed('a', 'b', 'c', 'd', function() {
  var a = this.get('a');
  var b = this.get('b');
  var c = this.get('c');
  var d = this.get('d');

  return Math.min(a, b, c, d);
}),

示例:

  • a = 0
  • b = 10
  • c = 20
  • d = 30

bestPrice:10

4 个答案:

答案 0 :(得分:1)

这个怎么样?

prices: Ember.computed.collect('a', 'b', 'c', 'd'),

bestPrice: Ember.computed('prices', function() {
  var nonzero = this.get('prices').filter(function (x) { return x > 0; });
  return Math.min.apply(null, nonzero);
}),

答案 1 :(得分:1)

如果你只需要忽略0,另一种方法(不同于过滤/减少)将用0替换+Infinity值,因此Math.min不会将它们视为最小值:

bestPrice: Ember.computed('a', 'b', 'c', 'd', function() {
    var a = this.get('a') || Infinity;
    var b = this.get('b') || Infinity;
    var c = this.get('c') || Infinity;
    var d = this.get('d') || Infinity;

    return Math.min(a, b, c, d);
 })

优点:

  • no if-else-s
  • 没有不必要的数组实例和迭代它们

缺点:

  • 这是一个黑客攻击
  • 仅适用于0-s

答案 2 :(得分:0)

为什么不把它们放在一个数组中并循环遍历它们?循环的每次迭代都会检查一个值是否为零并且是否小于当前最小值。像

这样的东西
var values = [a, b, c, d],
var min = -1;
for(var i = 0; i < values.length; i++)
{
    if(values[i] == 0)
        continue;

    if(values[i] < min || min == -1) // Also check if min is not yet assigned a value
        min = values[i];
}

return min;

顺便说一句,抱歉,如果我的任何语法错误。我的Javascript现在有点生疏。

答案 3 :(得分:0)

可能的解决方案:

var numbers = [a, b, c, d];

function findMin(array) {
  var minimum;

  for (var i = 0; i < array.length; i++) {
    if (!minimum) {
      if (array[i] !== 0) {
        minimum = array[i];
      }
      if (i === array.length - 1) {
        return 'All zeroes';
      }
    } else {
      if (array[i] === 0) {
        continue;
      } else {
        if (array[i] < minimum) {
          minimum = array[i];
        }
      }
    }
  }
  return minimum;
}

findMin(numbers);