JavaScript數組遍歷map()的原型擴展

在 JavaScript 1.6 裏,javascript 數組增長了幾個很是有用的方法:indexOf、lastIndexOf、every、 filter、 forEach、 map、 some,其中前兩個能夠歸爲元素定位方法,然後面的幾個則能夠歸爲迭代(iterative)方法。
javascript

遺憾的是:這些新方法並不是全部瀏覽器都支持,在這種狀況下,咱們就須要本身動手了,在這些介紹的文章中,咱們同時提供了在不支持這些新特性的瀏覽器中的實現方法。java

原生方法以下:數組

var mappedArray = array.map(callback[, thisObject]);
  • callback: 要對每一個數組元素執行的回調函數。
  • thisObject : 在執行回調函數時定義的this對象。

對數組中的每一個元素都執行一次指定的函數(callback),而且以每次返回的結果爲元素建立一個新數組。它只對數組中的非空元素執行指定的函數,沒有賦值或者已經刪除的元素將被忽略。瀏覽器

回調函數能夠有三個參數:當前元素,當前元素的索引和當前的數組對象。如參數 thisObject 被傳遞進來,它將被當作回調函數(callback)內部的 this 對象,若是沒有傳遞或者爲null,那麼將會使用全局對象。app

map 不會改變原有數組,記住:只有在回調函數執行前傳入的數組元素纔有效,在回調函數開始執行後才添加的元素將被忽略,而在回調函數開始執行到最後一個元素這一期間,數組元素被刪除或者被更改的,將以回調函數訪問到該元素的時間爲準,被刪除的元素將被忽略。函數

若是瀏覽器不支持map方法,也能夠按照下面的方式用prototype去擴展:this

<script type="text/javascript">
//擴展原型對象
Array.prototype.map = function(fn){
    var a = [];
    for(var i = 0; i < this.length; i++){
        var value = fn(this[i], i);
        if(value == null){
            continue; //若是函數fn返回null,則從數組中刪除該項
        }
        a.push(value);
    }
    return a;
};

//例子,arr爲原始數組
var arr = [
    {name: 'gonn', age: 20, sex: '1', No: '274200'},
    {name: 'nowamagic', age: 30, sex: '0', No: '274011'},
    {name: 'frie', age: 40, sex: '1', No: '274212'}
    ];
 
//使用map更改數組每項的值,可對數組每一項元素內部進行增刪改,也能夠經過return null來刪除數組的某項
var arr2 = arr.map(function(item, i){
    item.sex = item.sex == '0' ? '女' : '男';
    if(item.name == 'tom'){
        return null; //刪除name爲tom的項
    }
    return {
        index: i,
        name: item.name,
        age: item.age + 30 + i,
        sex: item.sex
    };
});
 
console.log(arr2);
</script>

在Firefox firebug控制檯輸出:prototype

[
Object { index=0, name="gonn", age=50, 更多...}, 
Object { index=1, name="nowamagic", age=61, 更多...}, 
Object { index=2, name="frie", age=72, 更多...}
]

或者如下方式擴展也能夠:對象

if (!Array.prototype.map)
{
    Array.prototype.map = function(fun /*, thisp*/)
    {
        var len = this.length;
        if (typeof fun != "function")
            throw new TypeError();
 
        var res = new Array(len);
        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
            if (i in this)
                res[i] = fun.call(thisp, this[i], i, this);
        }
 
        return res;
    };
}

Happy Coding.索引

相關文章
相關標籤/搜索