如何在JS自定义对象排序函数中使用Collator.compare
如何在自定义排序函数中集成Intl.Collator.compare?
嘿,这事儿其实超简单!你有两种方式可以把Intl.Collator的排序能力集成到你的逻辑里,我给你一步步讲清楚:
方式一:直接用collator.compare简化排序逻辑
如果你的需求只是按name属性排序,不需要额外的复杂判断,那直接用一个箭头函数把对象的name提取出来,传给collator.compare就行,代码清爽又高效:
var objs = [{name: '1_Document', size: 40}, {name: '11_Document', size: 50}, {name: '2_Document', size: 60}]; var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); // 直接通过箭头函数把对象的name属性传给collator.compare objs.sort((a, b) => collator.compare(a.name, b.name));
这样排序后,你的数组会按照自然数字顺序排列:1_Document → 2_Document → 11_Document,完全符合你设置的numeric: true规则。
方式二:集成到你的自定义compare函数中
如果之后你可能需要添加额外的排序条件(比如name相同时按size排序),可以把collator.compare调用放到你原来的自定义函数里,保留函数的扩展性:
// 先创建collator实例 var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); // 改造你的自定义compare函数 const compare = function(a, b) { // 先用collator比较两个对象的name属性 const nameResult = collator.compare(a.name, b.name); // 如果name的比较结果不是0(也就是两个name不一样),直接返回这个结果 if (nameResult !== 0) { return nameResult; } // 如果name相同,可以在这里添加其他排序逻辑,比如按size升序排列 return a.size - b.size; }; var objs = [{name: '1_Document', size: 40}, {name: '11_Document', size: 50}, {name: '2_Document', size: 60}]; objs.sort(compare);
这种方式既保留了你原来自定义函数的结构,又用上了Intl.Collator专业的本地化排序能力,后续扩展也很方便。
内容的提问来源于stack exchange,提问作者user2004082
相关产品推荐
相关产品推荐

