如何讓數組取最大值與最小值的方法討論
在一個數組中,如何取最大值與最小值有很多種方法,這里我們將從最笨的方法講起,然后講述改進后的方法。
原型是個好東西,通常除了Object的原型不應該擴展,向原型添加新方法是很好的選擇。
我們看一下如何為數組取最大值與最小值。最笨的方法估計是這樣:
01.
Array.prototype.max =
function
() {
02.
var
max =
this
[0];
03.
var
len =
this
.length;
04.
for
(
var
i = 1; i < len; i++){
05.
if
(
this
[i] > max) {
06.
max =
this
[i];
07.
}
08.
}
09.
return
max;
10.
}
11.
Array.prototype.min =
function
() {
12.
var
min =
this
[0];
13.
var
len =
this
.length;
14.
for
(
var
i = 1; i < len; i++){
15.
if
(
this
[i] < min){
16.
min =
this
[i];
17.
}
18.
}
19.
return
min;
20.
}
如果你是引入類庫進行工作,害怕類庫也實現了同名的原型方法,我們可以在生成之前進行判斷:
1.
if
(
typeof
Array.prototype[
'max'
] ==
'undefined'
) {
2.
Array.prototype.max =
function
() {
3.
//************略*************
4.
}
5.
}
但這兩個擴展實現得的確不怎么樣?!有什么原生的方法可以給我們用一用呢?John Resig巧妙地利用apply方法來調用原生的Math.max與Math.min方法迅速求得結果。apply能讓一個方法指定調用對象與傳入參數,并且傳入參數是以數組形式組織的。恰恰現在有一個方法叫Math.max,調用對象為Math,與多個參數。
1.
Array.max =
function
( array ){
2.
return
Math.max.apply( Math, array );
3.
};
4.
5.
Array.min =
function
( array ){
6.
return
Math.min.apply( Math, array );
7.
};
不過,John Resig是把它們做成Math對象的靜態方法,不能使用大神最愛用的鏈式調用了。但這方法還能更精簡一些,不要忘記,Math對象也是一個對象,我們用對象的字面量來寫,又可以省幾個比特了。
1.
Array.prototype.max =
function
(){
2.
return
Math.max.apply({},
this
)
3.
}
4.
Array.prototype.min =
function
(){
5.
return
Math.min.apply({},
this
)
6.
}
1.
[1,2,3].max()
// => 3
2.
[1,2,3].min()
// => 1
【編輯推薦】