javascript - 使用 lodash 和日期对数组对象进行排序
问题描述
在这里,我尝试对priority_level
字母进行排序,然后是数字,此外,我还尝试对priority_date
最旧的排序,priority_date
但它仍然必须显示我期望的字母第一个示例结果:
priority level: P Date: 1980-02-08T00:00:00.000Z
priority level: C Date: 2004-06-29T00:00:00.000Z
priority level: 1 Date: 2004-06-29T00:00:00.000Z
priority level: 1 Date: 2014-09-03T00:00:00.000Z
priority level: 5 Date: 2005-02-15T00:00:00.000Z
[这里像同一级别一样,1
它应该首先显示旧日期,就像上面一样。] 下面是我得到的对象数组,并希望对此执行整个逻辑操作。我正在使用 lodash orderby 但不确定它是否有帮助
const input = [{
priority_level: 'P ',
comments: '',
withdraw_granted_conditions: 'false',
condition: '',
_id: 5db00ad95399ab5cad9e6d44,
company: 5db00a135399ab5cad9e0049,
priority_date: 1980-02-08T00:00:00.000Z,
registration_type: 5db00a125399ab5cad9dfe4b,
sequence: 6835,
waiver_request: false,
waiver_granted: false,
waiver_letter_date: null,
letter_date: null,
waiver_sent: null,
no_extention_letter: false,
mpaa_extention_granted: false
},
{
priority_level: '1 ',
comments: '',
withdraw_granted_conditions: 'false',
condition: '',
_id: 5db00ad95399ab5cad9e6d43,
company: 5db00a145399ab5cad9e0096,
priority_date: 2004-06-29T00:00:00.000Z,
registration_type: 5db00a125399ab5cad9dfe4a,
sequence: 13505,
waiver_request: false,
waiver_granted: false,
waiver_letter_date: null,
letter_date: null,
waiver_sent: null,
no_extention_letter: false,
mpaa_extention_granted: false
},
{
priority_level: 'C ',
comments: '',
withdraw_granted_conditions: 'false',
condition: '',
_id: 5db00ad95399ab5cad9e6d42,
company: 5db00a135399ab5cad9dff5c,
priority_date: 2004-06-29T00:00:00.000Z,
registration_type: 5db00a125399ab5cad9dfe4a,
sequence: 13506,
waiver_request: false,
waiver_granted: false,
waiver_letter_date: null,
letter_date: null,
waiver_sent: null,
no_extention_letter: false,
mpaa_extention_granted: false
},
{
priority_level: '5 ',
comments: '',
withdraw_granted_conditions: 'false',
condition: '',
_id: 5db00ad95399ab5cad9e6d41,
company: 5db00a135399ab5cad9dff5a,
priority_date: 2005-02-15T00:00:00.000Z,
registration_type: 5db00a125399ab5cad9dfe4a,
sequence: 13508,
waiver_request: false,
waiver_granted: false,
waiver_letter_date: null,
letter_date: null,
waiver_sent: null,
no_extention_letter: false,
mpaa_extention_granted: false
},
{
priority_level: '1 ',
comments: '',
withdraw_granted_conditions: 'false',
condition: '',
_id: 5db00ad95399ab5cad9e6d41,
company: 5db00a135399ab5cad9dff5a,
priority_date: 2005-02-15T00:00:00.000Z,
registration_type: 5db00a125399ab5cad9dfe4a,
sequence: 13508,
waiver_request: false,
waiver_granted: false,
waiver_letter_date: null,
letter_date: null,
waiver_sent: null,
no_extention_letter: false,
mpaa_extention_granted: false
}]
const result = input.sort((a, b) => {
const aNumericPriorityLevel = Number.isInteger(Number.parseInt(a.priority_level));
const bNumericPriorityLevel = Number.isInteger(Number.parseInt(b.priority_level));
// If one items has letter priority level, and the other does not, sort
// a/b pair based on if a or b was the number
if (aNumericPriorityLevel !== bNumericPriorityLevel) {
return aNumericPriorityLevel ? 1 : -1;
}
// If a/b pair are both number or both letter, then sort in descending
// order based on date
return Date.parse(a.priority_date) - Date.parse(b.priority_date);
});
console.log(result)
以上工作正常,但不要用相同的priority_level优化日期,它搞砸了那个senario。就像想用字母和数字正常排序一样,但日期逻辑就像数据相同,那么它应该按日期降序排列。在这里,如果我想要数字排序为 1,2,3,3,4,5 等,但如果任何数字有 2 个整数,如 1,2,2,3,3,3,1 那么它应该保留为日期具有多个条目的数字的降序日期条目。
解决方案
一种方法如下:
// I've stripped out the extra data to give the answer more clarity
const input = [{
priority_level: 'P ',
priority_date: "1980-02-08T00:00:00.000Z"
},
{
priority_level: '1 ',
priority_date: "2004-06-29T00:00:00.000Z"
},
{
priority_level: '1 ',
priority_date: '1985-02-15T00:00:00.000Z'
},
{
priority_level: 'C ',
priority_date: "2004-06-29T00:00:00.000Z"
},
{
priority_level: '5 ',
priority_date: "2005-02-15T00:00:00.000Z"
}
]
const result = input.sort((a, b) => {
const aNumericPriorityLevel = Number.isInteger(Number.parseInt(a.priority_level));
const bNumericPriorityLevel = Number.isInteger(Number.parseInt(b.priority_level));
// If one items has letter priority level, and the other does not, sort
// a/b pair based on if a or b was the number
if (aNumericPriorityLevel !== bNumericPriorityLevel) {
return aNumericPriorityLevel ? 1 : -1;
}
else if(aNumericPriorityLevel === true) {
return bNumericPriorityLevel - aNumericPriorityLevel;
}
// If a/b pair are both number or both letter, then sort in descending
// order based on date
return Date.parse(b.priority_date) - Date.parse(a.priority_date);
});
console.log(result)
在这里,Array#sort
与基于两个标准对输入对进行排序的自定义回调一起使用:
- 主要排序条件取决于
priority_level
每个输入对象a
和的值b
。如果只有一个值可以解析为整数,那么我们将其作为排序条件给予优先级,并根据哪个项目具有priority_level
字段的数字字符串值来返回该对的排序方向。 - 否则,如果
a
和b
都具有数字(或非数字)字符串值priority_level
,则该对将根据它们的priority_date
值进行排序。在这里,该Date.parse()
方法可用于将您的日期字符串转换为整数,并使用解析的整数的差异来指导排序
希望有帮助!
推荐阅读
- reactjs - 带有反应导航的父堆栈导航器上的自定义标题
- python - 如何在*抽象语法树之前编辑解析树?
- python - 在类中定义的全局变量
- python - 使用 tf.keras.models.save_model() 保存多输入 TF 2.x 子类模型时出现 TypeError
- python - 代码不同部分的不同 QFileSystemModel 行计数值
- javascript - 为什么我不能使用 getElementsByTagName() 获得多个输入值?
- python - ModuleNotFoundError: No module named 'psycopg2' (python3, mac, pip3 显示 psycopg2 安装成功)
- c# - 如何在使用 nlog 中记录无限字符消息
- c++ - 如何替换双端队列对象中的元素?
- python - 有什么方法可以使用 discord.py(self-bot)自动兑换 Nitro 礼物?