47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
/**
|
|
* 解析 Pro 方法的匹配器参数
|
|
* @param {(Function|string|*)} a - 回调函数、属性键、或单值
|
|
* @param {*=} b - 属性值(与 a 配合使用)
|
|
* @returns {function(*): boolean} 匹配函数
|
|
* @private
|
|
*/
|
|
const _resolveMatcher = (a, b) => {
|
|
if (typeof a === 'function') return a;
|
|
if (typeof a === 'string' && b !== undefined) return (item) => item != null && item.getPro(a) === b;
|
|
return (item) => item === a;
|
|
};
|
|
|
|
/** @private @type {string[]} 支持增强方法的原始方法列表 */
|
|
const _methods = ['find', 'filter', 'findIndex', 'findLast', 'some', 'every'];
|
|
|
|
_methods.forEach((method) => {
|
|
/**
|
|
* 增强版数组遍历方法,支持三种调用模式
|
|
*
|
|
* **模式1 - 回调函数**(同原生方法)
|
|
* @example
|
|
* arr.findPro(item => item.id > 1)
|
|
* arr.filterPro(item => item.active)
|
|
*
|
|
* **模式2 - 单值精确匹配**
|
|
* @example
|
|
* ['aa','bb','cc'].findPro('bb')
|
|
* [1,2,2,3].filterPro(2)
|
|
*
|
|
* **模式3 - key-value 匹配**(支持嵌套路径,通过 getPro 访问)
|
|
* @example
|
|
* [{ user: { name: 'Bob' } }].findPro('user.name', 'Bob')
|
|
* arr.filterPro('status', 1)
|
|
*
|
|
* @name ${method}Pro
|
|
* @memberof Array.prototype
|
|
* @method
|
|
* @param {(Function|string|*)} a - 回调函数、属性键、或单值
|
|
* @param {*=} [b] - 属性值(当 a 为 string 时使用)
|
|
* @returns {*} 返回结果同对应原生方法
|
|
*/
|
|
Array.prototype[`${method}Pro`] = function (a, b) {
|
|
return this[method](_resolveMatcher(a, b));
|
|
};
|
|
});
|