这里我尝试对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,那么它应该被保存为有多个条目的数字的日期降序条目。
发布于 2019-12-06 14:55:32
一种方法如下:
// 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
与自定义回调一起使用,该回调根据两个条件对输入对进行排序:
a
和b
上的priority_level
的值。如果只有一个值可以解析为整数,那么我们给出一个排序准则,并根据哪一项具有priority_level
field.a
和b
都有priority_level
的数值(或非数字)字符串值,则根据其priority_date
值对该对进行排序。在这里,可以使用Date.parse()
方法将日期字符串转换为整数,并使用解析后的整数之间的差异来指导排序希望这能有所帮助!
发布于 2019-12-06 16:15:40
请看下图:
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);
https://stackoverflow.com/questions/59208098
复制相似问题