2014年3月7日 星期五

為Array自訂一個方法

Array的方法已經很完善

練習新增一個方法給Array使用
自訂一個和 filter 一模一樣的方法, 稱做 where

建立一個方法:
// 自訂一個和 filter 一模一樣的 function,傳入一個可以回傳 bool 的函式當第二個引數
function where(a, pred) {
    var result = [], n = a.length, j = 0;
    for (var i = 0; i < n; i++) {
        if (!pred(a[i], i)) {
            // 把陣列索引 i 傳入給 pred,而他可以選擇使用或忽略
            // 實際上,標準程式庫中所有的迭代函式(iteration functions),包括 forEach、map、filter,都會把陣列索引傳入給使用者所提供的函式
            continue;
        }
        result[j] = a[i];
        j++;
    }
    return result;
 
}
var a = where([1, 3, 5, 7, 9, 2, 4, 6, 8], function (n) {
    return n < 5;
});
console.log(a); // [1, 3, 2, 4]

將建立的方法給Array使用 : 
// 把自定的 where 方法,加到 Array.prototype,當成陣列的方法
Array.prototype.where = function (pred) {
    var result = [], n = this.length, j = 0;
    for (var i = 0; i < n; i++) {
        if (!pred(this[i], i)) {
            continue;
        }
        result[j] = this[i];
        j++;
    }
    return result;
};
 
var b = [1, 3, 5, 7, 9, 2, 4, 6, 8].where(function (n) { return n < 5; });
console.log(b); // [1, 3, 2, 4]

沒有留言: