【问题标题】:Sorting an array object with lodash along with date使用 lodash 和日期对数组对象进行排序
【发布时间】:2023-04-10 23:45:01
【问题描述】:

在这里,我试图对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 那么它应该保留为日期具有多个条目的数字的降序日期条目。

【问题讨论】:

    标签: javascript node.js reactjs lodash


    【解决方案1】:

    一种方法如下:

    // 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,2,3,3,4,5 等等但是如果任何数字有 2 个整数像 1,2,2,3,3,3,1那么它应该被保存为具有多个条目的数字的日期降序日期条目。
    • 喜欢用字母和数字正常排序工作正常,但日期逻辑就像数据相同,那么它应该按日期降序排列。
    • 我想我明白你在说什么,你希望项目按日期降序排列?我刚刚更新了代码 sn-p - 这符合您的要求吗?
    • 你能检查更新的问题吗?我已经提到了新的字符串和预期的结果
    • 谢谢 - 我根据新信息更新了答案,这是否按要求工作?这里是“字母”配对,项目将按日期递减。如果“数字”配对,则项目按降序日期排序。如果“数字”和“字母”成对出现,字母项目将排在第一位。这是否描述了预期的行为?
    【解决方案2】:

    请看如下:

    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);

    【讨论】:

    • 你的意思是priority_level和1,2,2,3,3,3,1的值一样吗?
    猜你喜欢
    • 2017-09-08
    • 1970-01-01
    • 2021-03-29
    • 2021-01-19
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多