UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

46 lines 1.26 kB
/** * 允许指定一个或多个规则对数据进行排序。 * * @param data 要排序的数据 * @param rules 一个或多个规则 * @returns 返回排序后的数据 * @example * ```ts * orderByRules( * ['x', 'xyz', 'xy'], * { * iteratee: item => item.length, * type: 'desc', * }, * ) * // => ['xyz', 'xy', 'x'] * ``` */ export function orderByRules(data, rules) { return (Array.isArray(rules) ? typeof rules[0] === 'function' ? [rules] : rules : [rules]).map(function (rule) { return Array.isArray(rule) ? { iteratee: rule[0], type: rule[1] } : rule; }).reduce(function (orderedData, rule) { var cachedKeys = []; var cachedValues = []; var cachedIteratee = function cachedIteratee(item) { var index = cachedKeys.indexOf(item); if (index === -1) { var value = rule.iteratee(item); cachedKeys.push(item); cachedValues.push(value); return value; } return cachedValues[index]; }; var isAsc = rule.type === 'asc'; orderedData.sort(function (a, b) { a = cachedIteratee(a); b = cachedIteratee(b); return a === b ? 0 : a > b ? isAsc ? 1 : -1 : isAsc ? -1 : 1; }); return orderedData; }, data.slice()); }