首頁 web前端 js教程 JavaScript程式中Array數組物件的擴充函數實例

JavaScript程式中Array數組物件的擴充函數實例

Nov 28, 2016 pm 01:45 PM
array

我們常常給String,Function,Array 的原型加上自訂的擴充函數,例如去除字串空格,陣列排序等

今天重點講下如何給Array物件擴充

1、直接在Array.prototype 上擴充

2、用自己方法對數組物件進行擴展

直接在Array.prototype上擴展,不能直接對dom對象使用(如:document.getElementsByTagName('div')得到的nodeList);

對有潔癖的同學們而言也破了原始生態環境的: )

先來看下yui操作數組的一些方法,這裡我對源碼簡單剝離並改動了下

(function(){
var YArray;

YArray =function(){
var YArray;

YArray = function(o,idx,arraylike){
var t = (arraylike) ? 2 : YArray.test(o),
l, a, start = idx || 0;
if (t) {
try {
return Array .prototype.slice.call(o, start); //借助Array原生方法來把aguments轉換為JS數組
} catch(e) {
a = [];
l = o.length;
for (; start a.push(o[start]);
}
return a;
}

} else {

return [o];

}


}

(Array.) {
var r = 0;
if (o && (typeof o == 'object' ||typeof o == 'function')) {
if (Object.prototype.toString.call(o) === "[ object Array]") {
r = 1;
} else {
try {
if (('length' in o) && !o.tagName && !o.alert && !o.apply) {
r = 2;
}
} catch(e) {}
}

}

return r;
}

YArray.each = (Array.prototype.forEach) ? //先偵測瀏覽器是否已支援,若有則呼叫原生
function (a, f, o) {
Array.prototype.forEach.call(a || [], f, o || Y);
return YArray;
} :
function (a, f, o) {
var l = (a && a.length) || 0, i;
for (i = 0; i f.call(o || Y, a[i], i , a);

}

return YArray;
};

YArray.hash = function(k, v) {
var o = {}, l = k.length, vl = v && v.length, i;
for (i=0; iif (k[i]) {

o[k[i]] = (vl && vl > i) ? v[i] : true;

}
}

return o;
};

YArray.indexOf = (Array.prototype.indexOf) ?
function(a, val) {
return Array.prototype. } :
function(a, val) {
for (var i=0; iif (a[i] === val) {
return i;
}
}

return -1; //找不到的情況

};

YArray.numericSort = function(a, b) {

return (a - b); //從小到大排序, return (b - a ); 從大到小

};

YArray.some = (Array.prototype.some) ?
function (a, f, o) {
return Array.prototype.some.call(a, f, o);
} :
function (a, f, o) {
var l = a.length, i;
for (i=0; iif (f.call(o, a[i], i, a)) {
return true;
}
}

return false;

};

})();

(Array方法來把aguments轉換為JSS數組的其他方法Dom物件不可以,只有遍歷)



Array.apply(null,arguments);
[].slice.call(arguments,0);
[].splice.call(arguments,0,arguments,0);

[].splice.call(arguments,0,arguments.length );

[].concat.apply([],arguments);
...



YArray函數不僅可以操作數組物件也對nodeList物件進行了操作

YArray(document.getElementsdivsdivsdivsdiv""ByTagName""By) );
遍歷dom物件重新組裝成一個陣列: )




a = [];
l = o.length;
for (; starta.push(o[start] );

}
return a;


YArray.each
遍歷數組,如有傳入函數,每次遍歷都執行callback



(item){

alert(item);// 執行了3次,1,2,3
});



YArray.hash

數組組裝成鍵值對可以理解成一個json
YArray.hash

數組組裝成鍵值對可以理解成一個json。 hash(["a","b"],[1,2]);


YArray.indexOf
回傳(想要找尋值)一樣的該值在數組的索引值

YArray.indexOf([1, 2],1)
YArray.numericSort

對數組進行排序,從小到大

[3, 1, 2].sort(YArray.numericSort);
YArray.some

是否數組中的有元素通過了callBack的處理了callBack的處理元素?如果有,則立刻回傳true,如果一個都沒有,則回傳false



YArray.some([3, 1, 2],function(el){
return el })



return el })




讓我們看看javascript 1.6 -1.8 對數組的擴展,並學習如何實現相同的功能
every

filter

forEach

indexOf

lastIndexOf
map.


if (!Array.prototype.every)
{
Array.prototype.every = function(fun /*, thisp*/)
{
var len = this.length >>> 0;
if (type funun ! = "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i {
if (i in this &&
!fun.call( thisp, this[i], i, this))
return false;
}
return true;
};

}


🎜

是否數組中的每個元素都通過了callBack的處理?如果是,則回傳true,如果有一個不是,則立刻回傳false
這和我們剛才提到的YUI種的some 函數很雷同:) 功能剛好相反

Array.prototype.filter


Armm

Array. prototype.filter = function (block /*, thisp */) { //過濾器,增加方便,進行判斷過濾

var values = [];
var thisp = arguments[1];
for (var i = 0; i if (block.call(thisp, this[i]))
values.push(this[i]);
return values;
};








var val= numbers.filter(function(t){

return t })

alert(val);



forEach 和indexOfsome 可以參考上面重述
lastIndexOf 和indexOf 程式碼相似只是從最後開始遍歷

下面講下' map'




Array.prototype.map = function(fun /* >> 0;
if (typeof fun != "function")

throw new TypeError();

var res = new Array(len);
var thisp = arguments[1];

for (var i = 0; i if (i in this)
res[i] = fun.call(thisp, this[i], i, this);
}

return res;

};


return res;

};



數組,執行函數,迭代數組,每個元素作為參數執行callBack方法,由callBack方法對每個元素進行處理,最後返回處理後的一個數組
var numbers = [1, 4, 9];
var roots = numbers.map(function(a){return a * 2});

Array.prototype.reduce




Array.prototype.reduce = function(fun /*, initial*/) {this varal* .length >>> 0;
if (typeof fun != "function")
throw new TypeError();
if (len == 0 && arguments.length == 1)
throw new TypeError(var); = 0;
if (arguments.length >= 2) {
var rv = arguments[1];
} else {
do {
if (i in this) {
rv = this[i++];
break;

break; }

if (++i >= len)
throw new TypeError();

} while (true);

}

for (; i if (i in this)
rv = fun. call(null, rv, this[i], i, this);}

return rv;
};




讓陣列元素依序呼叫給定函數,最後傳回一個值,換言之給定函數一定要用回傳值

Array.prototype.reduceRight
見名故而思意,從右往左




Array.prototype.reduceRight = function(fun /this, initial*/varal >>> 0;
if (typeof fun != "function")
throw new TypeError();
if (len == 0 && arguments.length == 1)
throw new TypeError();
var i = len - 1;
if (arguments.length >= 2) {
var rv = arguments[1];
} else {
do {
if (i in this) {
rv = this[i--];
break ;
}

if (--i throw new TypeError();
} while (true);}

for (; i >= 0; i--) {
if (i in this)

rv = fun.call(null, rv, this[i], i, this);

}
return rv;

};



除了這些,只用想用到的方法都能加到Array. prototype上
例如常用的toString


Array.prototype.toString = function () {

return this.join('');🎜};🎜🎜🎜 🎜等等🎜🎜🎜🎜
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用C#中的Array.Sort函數對陣列進行排序 使用C#中的Array.Sort函數對陣列進行排序 Nov 18, 2023 am 10:37 AM

標題:C#中使用Array.Sort函數對陣列進行排序的範例正文:在C#中,陣列是一種常用的資料結構,經常需要對陣列進行排序運算。 C#提供了Array類,其中有Sort方法可以方便地對陣列進行排序。本文將示範如何使用C#中的Array.Sort函數對陣列進行排序,並提供具體的程式碼範例。首先,我們要先了解Array.Sort函數的基本用法。 Array.So

如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組 如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組 Jun 26, 2023 pm 01:41 PM

在PHP中,有許多強大的陣列函數可以讓陣列的操作更加方便和快速。當我們需要將兩個陣列拼成一個關聯數組時,可以使用PHP的array_combine函數來實現這一操作。這個函數其實是用來將一個陣列的鍵當作另一個陣列的值,合併成一個新的關聯數組。接下來,我們將會講解如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組。了解array_comb

簡單明了的PHP array_merge_recursive()函式使用方法 簡單明了的PHP array_merge_recursive()函式使用方法 Jun 27, 2023 pm 01:48 PM

在進行PHP編程時,我們常常需要將數組合併。 PHP提供了array_merge()函數來完成數組合併的工作,但是當數組中存在相同的鍵時,函數會覆寫原來的值。為了解決這個問題,PHP在語言中還提供了一個array_merge_recursive()函數,該函數可以合併數組並保留相同鍵的值,使得程式的設計變得更加靈活。 array_merge

PHP array_fill()函數用法詳解 PHP array_fill()函數用法詳解 Jun 27, 2023 am 08:42 AM

在PHP程式設計中,陣列是一種非常重要的資料結構,能夠輕鬆處理大量資料。 PHP中提供了許多陣列相關的函數,array_fill()就是其中之一。本篇文章將詳細介紹array_fill()函數的用法,以及在實際應用上的一些技巧。一、array_fill()函數概述array_fill()函數的作用是建立一個指定長度的、由相同的值組成的陣列。具體來說,該函數的語法

Java中的ArrayIndexOutOfBoundsException異常常見原因是什麼? Java中的ArrayIndexOutOfBoundsException異常常見原因是什麼? Jun 24, 2023 pm 10:39 PM

Java是一種非常強大的程式語言,廣泛應用於各種開發領域。但是,在Java程式設計過程中,開發人員常會遇到ArrayIndexOutOfBoundsException異常。那麼,這個異常的常見原因是什麼呢? ArrayIndexOutOfBoundsException是Java中常見的一個執行時期例外。它表示在存取資料時,數組下標超出了數組的範圍。常見的原因包括以

PHP array_change_key_case()函數使用方法介紹 PHP array_change_key_case()函數使用方法介紹 Jun 27, 2023 am 10:43 AM

在PHP程式設計中,陣列是一個常用到的資料型別。而關於陣列的運算子也是相當多的,其中包含了array_change_key_case()函數。這個函數可以將數組中鍵名的大小寫轉換,從而方便我們進行資料的處理。本文就來介紹PHP中array_change_key_case()函數的使用方法。一、函數語法及參數array_change_ke

如何在Java中將LinkedList轉換為Array? 如何在Java中將LinkedList轉換為Array? Aug 29, 2023 pm 11:09 PM

LinkedList類別的toArray()方法將目前的LinkedList物件轉換為物件類型的陣列並傳回它。此數組按正確順序(從第一個元素到最後一個元素)包含此列表中的所有元素。它充當基於數組和基於集合的API之間的橋樑。因此,將LinkedList轉換為陣列-實例化LinkedList類別。使用add()方法填充它。呼叫上面建立的鍊錶上的toArray()方法並檢索物件數組。將物件數組的每個元素轉換為字串。範例 即時示範importjava.util.Arrays;importjava.uti

Java中的ArrayStoreException異常的解決方法 Java中的ArrayStoreException異常的解決方法 Jun 25, 2023 am 08:05 AM

在Java的開發中,我們經常使用陣列來儲存一系列的數據,因為陣列的便利性和效能優勢。但是,在使用陣列的過程中,會出現一些異常情況,其中一個常見的異常就是ArrayStoreException。當我們向數組中儲存不相容的資料類型時,就會拋出這個異常。這篇文章將介紹什麼是ArrayStoreException異常、它的產生原因,以及如何解決這個例外。一、Arr

See all articles