我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
当前回答
插入以逗号分隔的数字,然后单击要调用的事件,即获取最大或最小数字。
function maximumNumber() { var numberValue = document.myForm.number.value.split(","); var numberArray = []; for (var i = 0, len = numberValue.length; i < len; i += 1) { numberArray.push(+numberValue[i]); var largestNumber = numberArray.reduce(function (x, y) { return (x > y) ? x : y; }); } document.getElementById("numberOutput").value = largestNumber; } function minimumNumber() { var numberValue = document.myForm.number.value.split(","); var numberArray = []; for (var i = 0, len = numberValue.length; i < len; i += 1) { numberArray.push(+numberValue[i]); var smallestNumber = numberArray.reduce(function (x, y) { return (x < y) ? x : y; }); } document.getElementById("numberOutput").value = smallestNumber; } function restrictCharacters(evt) { evt = (evt) ? evt : window.event; var charCode = (evt.which) ? evt.which : evt.keyCode; if (((charCode >= '48') && (charCode <= '57')) || (charCode == '44')) { return true; } else { return false; } } <div> <form name="myForm"> <table> <tr> <td>Insert Number</td> <td><input type="text" name="number" id="number" onkeypress="return restrictCharacters(event);" /></td> <td><input type="button" value="Maximum" onclick="maximumNumber();" /></td> <td><input type="button" value="Minimum" onclick="minimumNumber();"/></td> <td><input type="text" id="numberOutput" name="numberOutput" /></td> </tr> </table> </form> </div>
其他回答
对于大数组(~10⁷elements), Math。min和数学。max在node.js中产生RangeError(超过最大调用堆栈大小)。
对于大数组,一个快速而肮脏的解决方案是:
Array.prototype.min = function() {
var r = this[0];
this.forEach(function(v,i,a){if (v<r) r=v;});
return r;
};
遍历,在执行过程中保持跟踪。
var min = null;
var max = null;
for (var i = 0, len = arr.length; i < len; ++i)
{
var elem = arr[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
alert( "min = " + min + ", max = " + max );
如果数组中没有元素,这将使min/max为空。如果数组中有任何元素,将在一次传递中设置最小值和最大值。
您还可以使用上述方法使用range方法扩展Array,以允许重用并提高可读性。在http://jsfiddle.net/9C9fU/上看到一个工作的小提琴
Array.prototype.range = function() {
var min = null,
max = null,
i, len;
for (i = 0, len = this.length; i < len; ++i)
{
var elem = this[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
return { min: min, max: max }
};
用作
var arr = [3, 9, 22, -7, 44, 18, 7, 9, 15];
var range = arr.range();
console.log(range.min);
console.log(range.max);
如果你使用的是原型机,ChaosPandion的解决方案是有效的。如果不是,考虑一下:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
如果数组值不是整数,上面的函数将返回NaN,因此您应该构建一些功能来避免这种情况。否则这个就可以了。
对于大数组(~10⁷elements), Math。min和数学。max会在Node.js中产生以下错误。
RangeError:超过最大调用堆栈大小
一个更健壮的解决方案是不把每个元素都添加到调用堆栈中,而是传递一个数组:
function arrayMin(arr) {
return arr.reduce(function (p, v) {
return ( p < v ? p : v );
});
}
function arrayMax(arr) {
return arr.reduce(function (p, v) {
return ( p > v ? p : v );
});
}
如果你关心速度,下面的代码比我电脑上的Math.max.apply快3倍。见https://jsben.ch/JPOyL。
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
};
如果数组包含字符串而不是数字,还需要将它们强制转换为数字。下面的代码可以做到这一点,但它会使代码在我的机器上减慢~10倍。见https://jsben.ch/uPipD。
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (Number(arr[len]) < min) {
min = Number(arr[len]);
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (Number(arr[len]) > max) {
max = Number(arr[len]);
}
}
return max;
};
如何使用Math.max/Math扩展内置Array对象呢?最小值:
Array.prototype.max = function() { Math.max返回。应用(null,这); }; Array.prototype.min = function() { Math.min返回。应用(null,这); }; 令p = [35,2,65,7,8,9,12,121,33,99]; console.log('最大值为:${p.max()} ' + \nMin值为:${p.min()} ');
这是一个JSFiddle。
扩充内置库可能会导致与其他库的冲突(有些见),所以你可能更喜欢直接将Math.xxx()应用到你的数组:
var min = Math.min.apply(null, arr),
max = Math.max.apply(null, arr);
另外,假设你的浏览器支持ECMAScript 6,你可以使用扩展语法,它的功能类似于apply方法:
var min = Math.min( ...arr ),
max = Math.max( ...arr );