首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用lodash和date对数组对象进行排序

使用lodash和date对数组对象进行排序
EN

Stack Overflow用户
提问于 2019-12-06 14:39:08
回答 2查看 80关注 0票数 1

这里我尝试对priority_level进行排序,首先是字母表,然后是数字,同时我还试图对priority_date进行排序,使最早的值首先与priority_date一起出现,但它仍然必须显示我期望的字母表第一个示例结果:

代码语言:javascript
运行
复制
            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,但不确定它对此有帮助。

代码语言:javascript
运行
复制
   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,那么它应该被保存为有多个条目的数字的日期降序条目。

EN

回答 2

Stack Overflow用户

发布于 2019-12-06 14:55:32

一种方法如下:

代码语言:javascript
运行
复制
// 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与自定义回调一起使用,该回调根据两个条件对输入对进行排序:

  • 主要排序标准取决于每个输入对象ab上的priority_level的值。如果只有一个值可以解析为整数,那么我们给出一个排序准则,并根据哪一项具有priority_level field.
  • Otherwise,的数值字符串值,返回此对的排序方向。如果ab都有priority_level的数值(或非数字)字符串值,则根据其priority_date值对该对进行排序。在这里,可以使用Date.parse()方法将日期字符串转换为整数,并使用解析后的整数之间的差异来指导排序

希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2019-12-06 16:15:40

请看下图:

代码语言:javascript
运行
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59208098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档