javascript - 如何按条件和空值始终排在最后的 3 个字段对对象数组进行排序

标签 javascript arrays sorting

我有一个对象数组,需要按 3 个日期字段(date1、date2、date3)排序

  1. 首先按日期1升序排序
  2. 如果有更多的文档具有相同的日期 1 按日期 3 升序排序
  3. (具有 null 或未定义 date1 的文档必须在最后)
  4. 如果 date1 未定义或为空,则按 date2 升序排序,
  5. 如果有更多的文档具有相同的日期 2 按日期 3 升序排序

假设我有这个数组:


    [
        { date1: null, date2: '20120-01-08', date3: '20120-01-06' },
        { date1: null, date2: '20120-01-09', date3: '20120-01-05' },
        { date1: null, date2: '20120-01-08', date3: '20120-01-05' },
        { date1: '20120-01-05', date2: '20120-01-07', date3: '20120-01-01' },
        { date1: '20120-01-04', date2: '20120-01-07', date3: '20120-01-02' },
        { date1: '20120-01-04', date2: '20120-01-10', date3: '20120-01-01' }
    ]

我需要得到这个:


    [
        { date1: '20120-01-04', date2: '20120-01-10', date3: '20120-01-01' },
        { date1: '20120-01-04', date2: '20120-01-07', date3: '20120-01-02' },
        { date1: '20120-01-05', date2: '20120-01-07', date3: '20120-01-01' },
        { date1: null, date2: '20120-01-08', date3: '20120-01-05' },
        { date1: null, date2: '20120-01-08', date3: '20120-01-06' },
        { date1: null, date2: '20120-01-09', date3: '20120-01-05' }
    ]

我尝试使用 array.sort() 并设法解决了最合适的 3 个要求:

  1. 首先按日期1升序排序
  2. 如果有更多的文档具有相同的日期 1 按日期 3 升序排序
  3. (具有 null 或未定义 date1 的文档必须在最后)

使用这个排序函数:


    var array = [
      { date2: "20120-01-08", date3: "20120-01-06" },
      { date2: "20120-01-09", date3: "20120-01-05" },
      { date2: "20120-01-08", date3: "20120-01-05" },
      { date1: "20120-01-05", date2: "20120-01-07", date3: "20120-01-01" },
      { date1: "20120-01-04", date2: "20120-01-07", date3: "20120-01-02" },
      { date1: "20120-01-04", date2: "20120-01-10", date3: "20120-01-01" }
    ];

    var result = array.sort(function(obj1, obj2) {
      if (!obj1.date1 || !obj2.date1) {
        return -1;
      } else {
        if (obj1.date1 > obj2.date1) return 1;
        if (obj1.date1 < obj2.date1) return -1;
        if (obj1.data3 > obj2.data3) return 1;
        if (obj1.date3 < obj2.date3) return -1;
        return 0;
      }
    });

我明白了:


    0: {date1: "20120-01-04", date2: "20120-01-10", date3: "20120-01-01"}
    1: {date1: "20120-01-04", date2: "20120-01-07", date3: "20120-01-02"}
    2: {date1: "20120-01-05", date2: "20120-01-07", date3: "20120-01-01"}
    3: {date2: "20120-01-08", date3: "20120-01-05"}
    4: {date2: "20120-01-09", date3: "20120-01-05"}
    5: {date2: "20120-01-08", date3: "20120-01-06"}

我不确定如何解决这 2 个问题:

  1. 如果 date1 未定义或为空,则按 date2 升序排序,
  2. 如果有更多的文档具有相同的日期 2 按日期 3 升序排序

未定义 date1 的记录未排序...

https://codepen.io/wyzix33/pen/agaKRp

谢谢

最佳答案

你可以排序

  • undefined/null/falsy date1 的值并将它们排序到底部,
  • date1 或者如果是 falsy date2,
  • date3.

var data = [{ date1: null, date2: '20120-01-08', date3: '20120-01-06' }, { date1: null, date2: '20120-01-09', date3: '20120-01-05' }, { date1: null, date2: '20120-01-08', date3: '20120-01-05' }, { date1: '20120-01-05', date2: '20120-01-07', date3: '20120-01-01' }, { date1: '20120-01-04', date2: '20120-01-07', date3: '20120-01-02' }, { date1: '20120-01-04', date2: '20120-01-10', date3: '20120-01-01' }];

data.sort((a, b) =>
    !a.date1 - !b.date1 ||
    (a.date1 || a.date2).localeCompare(b.date1 || b.date2) ||
    a.date3.localeCompare(b.date3)
);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 如何按条件和空值始终排在最后的 3 个字段对对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911926/

相关文章:

javascript - 如何vuetify动态生成的vue表?

javascript - 生成所有可能的真/假组合

arrays - "erase as few numbers as possible to make remaining in increasing order"的算法

javascript - 排序多维数组jquery/javascript

JavaScript 表格分页呈现 JSON 数据

javascript - 如何模拟作为参数传递的回调的调用?

javascript - html canvas 设置 mouseup 事件的 x 和 y 坐标

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

c - 按字母顺序对单词数组进行排序

c - 如何在 C 中实现 strcpy() 和结构排序?