用lodash和日期对数组对象进行排序

时间:2019-12-06 06:39:07

标签: javascript node.js reactjs 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,3,1,则应将其保留为日期具有多个条目的数字的降序日期条目。

2 个答案:

答案 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的值 在每个输入对象ab上。如果只有一个值可解析为整数,则我们将其优先作为排序标准,并根据哪个项具有priority_level字段的数字字符串值来返回该对的排序方向。
  • 否则,如果ab都具有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);