如何在JavaScript对象数组多属性排序时强制指定类别优先?
问题:强制指定类别排在数组排序首位
原始数据
// dishes: [ {category: 'LEGUME', description: 'A'}, {category: 'VEGETABLE', description: 'N'}, {category: 'VEGETABLE', description: 'B'}, {category: 'VEGETABLE', description: 'A'}, {category: 'FISH', description: 'C'}, {category: 'LEGUME', description: 'E'}, {category: 'LEGUME', description: 'B'}, {category: 'LEGUME', description: 'N'}, ]
原排序逻辑
原本使用的排序函数:
const dishes = dishes.sort((a, b) => { if (a.category > b.category) return -1; if (a.category < b.category) return 1; return a.description.localeCompare(b.description); });
原排序结果
排序后输出:
// dishes: [ {category: 'LEGUME', description: 'A'}, {category: 'LEGUME', description: 'B'}, {category: 'LEGUME', description: 'E'}, {category: 'LEGUME', description: 'N'}, {category: 'VEGETABLE', description: 'A'}, {category: 'VEGETABLE', description: 'B'}, {category: 'VEGETABLE', description: 'N'}, {category: 'FISH', description: 'C'}, ]
期望排序结果
希望将VEGETABLE类别强制排在最前面,输出如下:
// dishes: [ {category: 'VEGETABLE', description: 'A'}, {category: 'VEGETABLE', description: 'B'}, {category: 'VEGETABLE', description: 'N'}, {category: 'LEGUME', description: 'A'}, {category: 'LEGUME', description: 'B'}, {category: 'LEGUME', description: 'E'}, {category: 'LEGUME', description: 'N'}, {category: 'FISH', description: 'C'}, ]
可行解决方案
感谢@Andrew Parks提供的最终实现:
dishes.sort((a, b) => +(b.category === "VEGETABLE") - +(a.category === "VEGETABLE") || a.category.localeCompare(b.category) || a.description.localeCompare(b.description) );
逻辑说明:
- 最高优先级:通过
+(b.category === "VEGETABLE") - +(a.category === "VEGETABLE")实现目标类别前置。布尔值转数字后,若b是目标类别、a不是,结果为1-0=1,a会排在b后面;若a是目标类别、b不是,结果为0-1=-1,a会排在b前面;两者同为或同不为目标类别时,结果为0,进入下一层判断。 - 次优先级:按
category字段的自然语言排序规则排序。 - 最后优先级:按
description字段的自然语言排序规则排序。
内容的提问来源于stack exchange,提问作者ismaestro
相关产品推荐
相关产品推荐

