在这里,我尝试对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,3,1,则应将其保留为日期具有多个条目的数字的降序日期条目。
答案 0 :(得分:0)
一种方法如下:
// 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()
方法可用于将日期字符串转换为整数,而解析后的整数的差用于指导排序希望有帮助!
答案 1 :(得分:0)
请看以下内容:
const dataObj = [{
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: '1985-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 getAlphabet = [];
const getNumber = [];
const alphabetCheck = /^[a-zA-Z]/g;
dataObj.map((item) => {
if (item.priority_level.match(alphabetCheck)) {
return getAlphabet.push(
{ priority_level: item.priority_level, priority_date: item.priority_date }
);
}
return getNumber.push(
{ priority_level: item.priority_level, priority_date: item.priority_date }
);
});
const getSortedAlphabet = getAlphabet.sort((a, b) => ((a.priority_date > b.priority_date) ? 1 : ((b.priority_date > a.priority_date) ? -1 : 0)));
const getSortedDate = getNumber.sort((a, b) => ((a.priority_date > b.priority_date) ? 1 : ((b.priority_date > a.priority_date) ? -1 : 0)));
const tempCombine = [...getSortedAlphabet, ...getSortedDate];
console.log('tempCombine', tempCombine);