首页 > 解决方案 > 使用 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 那么它应该保留为日期具有多个条目的数字的降序日期条目。

标签: javascriptnode.jsreactjslodash

解决方案


一种方法如下:

// 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字段的数字字符串值来返回该对的排序方向。
  • 否则,如果ab都具有数字(或非数字)字符串值priority_level,则该对将根据它们的priority_date值进行排序。在这里,该Date.parse()方法可用于将您的日期字符串转换为整数,并使用解析的整数的差异来指导排序

希望有帮助!


推荐阅读