Source

filter.js

/**
 * @callback filterCallback filter 过滤函数
 * @param {Object} value 数组中的一项数据
 * @param {Number} index 该项数据的下标
 * @param {Array} sourceArray 源数组
 * @returns {Boolean} 是否通过校验,返回 true 则该数据项会被进入 filter 函数返回的新数组中,否则不会
 */

/** 使用指定过滤函数在指定源数组每一项上执行,返回一个新的数组包含指定过滤函数返回真值的数组项
 *
 * @param {Array} arr 指定源数组
 * @param {filterCallback} fn 指定过滤函数
 * @param {Object}  context 指定过滤函数执行上下文
 * @returns {Array} 新的数组,包含指定过滤函数值行返回真值的源数组项
 * @category Array
 * @function filter
 *
 * @example
 * filter([1,2,3,4,5,6],
 * function(v,i,arr)
 * {
 *   console.log(v,i,arr);
 *    return v>=4
 * });
 * //=>
 * // 1 0 [1, 2, 3, 4, 5, 6]
 * // 2 1 [1, 2, 3, 4, 5, 6]
 * // 3 2 [1, 2, 3, 4, 5, 6]
 * // 4 3 [1, 2, 3, 4, 5, 6]
 * // 5 4 [1, 2, 3, 4, 5, 6]
 * // 6 5 [1, 2, 3, 4, 5, 6]
 * // [4,5,6] // return value
 */
export default function filter(arr, fn, context) {
  var hasOwn = Object.prototype.hasOwnProperty;
  if (arr.filter) {
    return arr.filter(fn);
  }
  var ret = [];
  for (var i = 0; i < arr.length; i++) {
    if (!hasOwn.call(arr, i)) {
      continue;
    }
    var val = arr[i];
    if (fn.call(context, val, i, arr)) {
      ret.push(val);
    }
  }
  return ret;
}