两个值中的最小值,这些值不得为0

Min of a couple of values which must not be 0

本文关键字:两个 最小值      更新时间:2023-09-26

我需要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

最佳价格:10

这个怎么样?

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

如果您只需要忽略0,与过滤/减少不同的另一种方法是用+Infinity替换0值,因此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);
 })

优点:

  • 没有if-else-s
  • 没有不必要的数组实例及其迭代

缺点:

  • 这有点像黑客
  • 仅适用于0-s

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

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现在有点生疏了。