詳解Javascript中的Array擴展
Javascript中的Array擴展,一般都是從對象本身入手。這里我們將介紹一些Array對象中的一些東西,比如indexOf是返回元素在數(shù)組的索引,沒有則返回-1等等。
最近看了一下developer.mozilla.org里的東西,發(fā)現(xiàn)它為Array擴展添加了不少generic method,趕得上Prototype的熱心程度。
indexOf
返回元素在數(shù)組的索引,沒有則返回-1。與string的indexOf方法差不多。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
lastIndexOf
- Array.prototype.indexOf = function(el, start) {
- var startstart = start || 0;
- for ( var i=0; i < this.length; ++i ) {
- if ( this[i] === el ) {
- return i;
- }
- }
- return -1;
- };
- var array = [2, 5, 9];
- var index = array.indexOf(2);
- // index is 0
- index = array.indexOf(7);
- // index is -1
與string的lastIndexOf方法差不多。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
forEach
- Array.prototype.lastIndexOf = function(el, start) {
- var startstart = start || this.length;
- if ( start >= this.length ) {
- start = this.length;
- }
- if ( start < 0 ) {
- start = this.length + start;
- }
- for ( var i=start; i >= 0; --i ) {
- if ( this[i] === el ) {
- return i;
- }
- }
- return -1;
- };
各類庫中都實現(xiàn)相似的each方法。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
- Array.prototype.forEach = function(fn, thisObj) {
- var scope = thisObj || window;
- for ( var i=0, j=this.length; i < j; ++i ) {
- fn.call(scope, this[i], i, this);
- }
- };
- function printElt(element, index, array) {
- print("[" + index + "] is " + element); // assumes print is already defined
- }
- [2, 5, 9].forEach(printElt);
- // Prints:
- // [0] is 2
- // [1] is 5
- // [2] is 9
every
如果數(shù)組中的每個元素都能通過給定的函數(shù)的測試,則返回true,反之false。換言之給定的函數(shù)也一定要返回true與false
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
some
- Array.prototype.every = function(fn, thisObj) {
- var scope = thisObj || window;
- for ( var i=0, j=this.length; i < j; ++i ) {
- if ( !fn.call(scope, this[i], i, this) ) {
- return false;
- }
- }
- return true;
- };
- function isBigEnough(element, index, array) {
- return (element >= 10);
- }
- var passed = [12, 5, 8, 130, 44].every(isBigEnough);
- console.log(passed)
- // passed is false
- passed = [12, 54, 18, 130, 44].every(isBigEnough);
- // passed is true
- console.log(passed)
類似every函數(shù),但只要有一個通過給定函數(shù)的測試就返回true。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
filter
- Array.prototype.some = function(fn, thisObj) {
- var scope = thisObj || window;
- for ( var i=0, j=this.length; i < j; ++i ) {
- if ( fn.call(scope, this[i], i, this) ) {
- return true;
- }
- }
- return false;
- };
- function isBigEnough(element, index, array) {
- return (element >= 10);
- }
- var passed = [2, 5, 8, 1, 4].some(isBigEnough);
- // passed is false
- passed = [12, 5, 8, 1, 4].some(isBigEnough);
- // passed is true
把符合條件的元素放到一個新數(shù)組中返回。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
map
- Array.prototype.filter = function(fn, thisObj) {
- var scope = thisObj || window;
- var a = [];
- for ( var i=0, j=this.length; i < j; ++i ) {
- if ( !fn.call(scope, this[i], i, this) ) {
- continue;
- }
- a.push(this[i]);
- }
- return a;
- };
- function isBigEnough(element, index, array) {
- return (element <= 10);
- }
- var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
讓數(shù)組中的每一個元素調(diào)用給定的函數(shù),然后把得到的結(jié)果放到新數(shù)組中返回。。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
reduce
- Array.prototype.map = function(fn, thisObj) {
- var scope = thisObj || window;
- var a = [];
- for ( var i=0, j=this.length; i < j; ++i ) {
- a.push(fn.call(scope, this[i], i, this));
- }
- return a;
- };
- var numbers = [1, 4, 9];
- var roots = numbers.map(Math.sqrt);
- // roots is now [1, 2, 3]
- // numbers is still [1, 4, 9]
讓數(shù)組元素依次調(diào)用給定函數(shù),***返回一個值,換言之給定函數(shù)一定要用返回值。
如果其他瀏覽器沒有實現(xiàn)此方法,可以用以下代碼實現(xiàn)兼容:
原文標(biāo)題:javascript Array擴展
- Array.prototype.reduce = function(fun /*, initial*/)
- {
- var len = this.length >>> 0;
- if (typeof fun != "function")
- throw new TypeError();
- if (len == 0 && arguments.length == 1)
- throw new TypeError();
- var i = 0;
- if (arguments.length >= 2){
- var rv = arguments[1];
- } else{
- do{
- if (i in this){
- rv = this[i++];
- break;
- }
- if (++i >= len)
- throw new TypeError();
- }while (true);
- }
- for (; i < len; i++){
- if (i in this)
- rv = fun.call(null, rv, this[i], i, this);
- }
- return rv;
- };
- var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
- // total == 6
鏈接:http://www.cnblogs.com/rubylouvre/archive/2009/09/20/1570461.html
【編輯推薦】