两个值中的最小值,这些值不得为0
Min of a couple of values which must not be 0
我需要a
、b
、c
和d
中的最小值。但当其中一个或多个为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现在有点生疏了。
相关文章:
- Html5输入属性的默认值,如最小值、最大值、大小等
- 使用javascript将两个文本框值相加到表中的另一个文本框中
- Angular JS在一行中查找最小值
- 如何将(a*b)两个输入文本值相乘,并在javascript中随文本变化动态显示
- 交换对象上两个属性的值
- 识别滑块范围的最小值和最大值
- 如何通过在JavaScript对象中的多个键/值对中查找最小值来选择键/值配对
- 文本框的多个最小值和最大值
- 带有两个处理程序的 jQuery 范围滑块.读取最小值和最大值
- 如何从 Javascript 数组中获取两个最大的整数并将值返回给 DOM
- 根据第一个询问的输入设置输入类型范围的最小值
- 从多个下拉选择列表(如math.min)中选择最小值
- 我有四个html文本框.在其他文本框中显示最小值
- 在javascript中的数组中查找多个最小值的索引
- 查找两个数组之间的公共最小值
- Jquery UI datepicker -如何在一个日期选择器中设置两个最小/最大日期限制
- 两个值中的最小值,这些值不得为0
- 两个框,两个最大值-但不设置哪个值属于哪个框
- 两个输入数字字段的最大值和最小值的组合
- CSS两个最小高度值,以's更大