如何链式调用Intl.Collator().compare实现多字段优先级排序
你可以通过封装通用比较器组合工具实现等价Java thenComparing 的链式/多规则排序能力,完全保留Intl.Collator对本地化字符、重音的处理能力,和原有写法执行效果完全一致。
方案1:轻量组合函数(无原型污染,推荐)
先定义通用的比较器组合函数,按排序优先级传入多个比较规则即可:
// 入参为排序优先级从高到低的比较函数 const composeComparators = (...comparators) => (a, b) => { for (const compare of comparators) { const result = compare(a, b); if (result !== 0) return result; } return 0; };
使用示例:
const collator = new Intl.Collator(); const sorted = [...unsorted].sort( composeComparators( (a, b) => collator.compare(a.firstName, b.firstName), (a, b) => collator.compare(a.lastName, b.lastName) // 新增排序字段只需在此追加规则即可 ) );
方案2:链式调用风格(和Java用法一致)
如果偏好thenComparing的链式写法,可以给函数原型扩展对应方法:
Function.prototype.thenComparing = function (nextComparator) { const prevComparator = this; return (a, b) => { const prevResult = prevComparator(a, b); return prevResult !== 0 ? prevResult : nextComparator(a, b); }; };
使用示例:
const collator = new Intl.Collator(); const sorted = [...unsorted].sort( ((a, b) => collator.compare(a.firstName, b.firstName)) .thenComparing((a, b) => collator.compare(a.lastName, b.lastName)) // 继续链式追加更多排序规则 // .thenComparing((a, b) => a.age - b.age) );
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

