vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
50 lines (49 loc) • 1.34 kB
JavaScript
exports.__esModule = true;
exports.orderByRules = orderByRules;
/**
* 允许指定一个或多个规则对数据进行排序。
*
* @param data 要排序的数据
* @param rules 一个或多个规则
* @returns 返回排序后的数据
* @example
* ```ts
* orderByRules(
* ['x', 'xyz', 'xy'],
* {
* iteratee: item => item.length,
* type: 'desc',
* },
* )
* // => ['xyz', 'xy', 'x']
* ```
*/
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());
}
;