如何使用lodash的_sortBy()按字母顺序对列表进行自定义设置?

时间:2018-11-09 21:36:24

标签: javascript underscore.js lodash

我有以下对象数组:

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

如何实现?

5 个答案:

答案 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; }