我有以下对象数组:
const myList = [
{ id: 1, title: '[A] Animal Bite - F - Not Pregnant' },
{ id: 2, title: '[P] Sinus Pain - M' },
{ id: 3, title: '[A] Animal Bite - F - Pregnant' },
{ id: 4, title: 'Check up male' },
{ id: 5, title: '[A] Animal Bite - M' },
{ id: 6, title: 'Duration' },
{ id: 7, title: '[P] Skin Injury - F - Not Pregnant' },
{ id: 8, title: '[P] Skin Injury - M' },
{ id: 9, title: 'Emergency Screening' }
]
这样做之后:
_.sortBy(myList, 'title');
我得到:
Check up male
Duration
Emergency Screening
[A] Animal Bite - F - Not Pregnant
[A] Animal Bite - F - Pregnant
[A] Animal Bite - M
[P] Sinus Pain - M
[P] Skin Injury - F - Not Pregnant
[P] Skin Injury - M
除了我希望没有[A]或[P]的项目位于底部而不是顶部,看起来不错。而是这样:
[A] Animal Bite - F - Not Pregnant
[A] Animal Bite - F - Pregnant
[A] Animal Bite - M
[P] Sinus Pain - M
[P] Skin Injury - F - Not Pregnant
[P] Skin Injury - M
Check up male
Duration
Emergency Screening
如何实现?
答案 0 :(得分:1)
这是使用功能Array.prototype.sort()
假设字符串中最多有一个[
。
const myList = [ { id: 1, title: '[A] Animal Bite - F - Not Pregnant' }, { id: 2, title: '[P] Sinus Pain - M' }, { id: 3, title: '[A] Animal Bite - F - Pregnant' }, { id: 4, title: 'Check up male' }, { id: 5, title: '[A] Animal Bite - M' }, { id: 6, title: 'Duration' }, { id: 7, title: '[P] Skin Injury - F - Not Pregnant' }, { id: 8, title: '[P] Skin Injury - M' }, { id: 9, title: 'Emergency Screening' }];
myList.sort((a, b) => {
if (a.title.startsWith("[") && b.title.startsWith("[")) {
return a.title.substring(1).localeCompare(b.title.substring(1));
}
return a.title.localeCompare(b.title);
});
console.log(myList);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
在排序函数中将resource_*
与numeric: false
选项一起使用:
const list = [ { id: 1, title: '[A] Animal Bite - F - Not Pregnant' }, { id: 2, title: '[P] Sinus Pain - M' }, { id: 3, title: '[A] Animal Bite - F - Pregnant' }, { id: 4, title: 'Check up male' }, { id: 5, title: '[A] Animal Bite - M' }, { id: 6, title: 'Duration' }, { id: 7, title: '[P] Skin Injury - F - Not Pregnant' }, { id: 8, title: '[P] Skin Injury - M' }, { id: 9, title: 'Emergency Screening' } ]
const r = list.sort((a,b) => a.title.localeCompare(b.title, 0, {numeric: false}))
console.log(r)
您也可以获得相同结果的另一种方法是通过{caseFirst: lower'}
提示(并解释)的@xehpuk
选项参数:
const list = [ { id: 1, title: '[A] Animal Bite - F - Not Pregnant' }, { id: 2, title: '[P] Sinus Pain - M' }, { id: 3, title: '[A] Animal Bite - F - Pregnant' }, { id: 4, title: 'Check up male' }, { id: 5, title: '[A] Animal Bite - M' }, { id: 6, title: 'Duration' }, { id: 7, title: '[P] Skin Injury - F - Not Pregnant' }, { id: 8, title: '[P] Skin Injury - M' }, { id: 9, title: 'Emergency Screening' } ]
const r = list.sort((a,b) => a.title.localeCompare(b.title, 0, {caseFirst: 'lower'}))
console.log(r)
如果选择了 ES6 ,则也不需要使用破折号。
答案 2 :(得分:1)
lodash的sortBy
可能包含比较器列表。因此,您只需声明“单词不要从方括号开始,以后再说”,并在“组”内按标题排序
_.sortBy(myList, [
item => !item.title.startsWith("["),
'title'
]);
借助orderBy
,您甚至可以以更具可读性(更灵活)的方式指定顺序:
_.orderBy(myList, [
item => item.title.startsWith("["),
'title'
], ['desc', 'asc']);
@Ele提到的带有startsWith
的[UPD]看起来更好
答案 3 :(得分:1)
如果您真的想使用lodash,可以比较小写的标题:
_.sortBy(myList, item => item.title.toLowerCase());
之所以起作用,是因为小写字符(97-122)的代码单位大于[
(91)之一。这样还可以比较不区分大小写地比较标题。
答案 4 :(得分:0)
您可以通过检查字符串将括号部分移到顶部,然后获取本地比较结果。
const
startsWithBrackets = s => /^\[.+\]/.test(s),
myList = [{ id: 1, title: '[A] Animal Bite - F - Not Pregnant' }, { id: 2, title: '[P] Sinus Pain - M' }, { id: 3, title: '[A] Animal Bite - F - Pregnant' }, { id: 4, title: 'Check up male' }, { id: 5, title: '[A] Animal Bite - M' }, { id: 6, title: 'Duration' }, { id: 7, title: '[P] Skin Injury - F - Not Pregnant' }, { id: 8, title: '[P] Skin Injury - M' }, { id: 9, title: 'Emergency Screening' }];
myList.sort(({ title: a }, { title: b }) =>
startsWithBrackets(b) - startsWithBrackets(a) || a.localeCompare(b));
console.log(myList);
.as-console-wrapper { max-height: 100% !important; top: 0; }