Как я могу отсортировать массив объектов по 3 полям с условиями и нулевые значения всегда идут последними - PullRequest
1 голос
/ 06 июля 2019

У меня есть массив objectds, и мне нужно отсортировать по 3 полям даты (date1, date2, date3)

  1. Первая сортировка по дате1 по возрастанию
  2. , если есть больше документов ста же дата1 сортировка по дате3 по возрастанию
  3. (документы с нулевой или неопределенной датой1 должны быть последними)
  4. , если дата1 не определена, или нулевая сортировка по дате2 по возрастанию,
  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. (документы с нулевой или неопределенной датой1 должны быть последними)

с использованием этой функции сортировки:


    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 не определена или сортировка по нулю по дате2 по возрастанию, , если есть больше документов с той же датой2, сортировка по дате3 по возрастанию

записи с неопределенной датой1 не сортируются...

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Вы можете отсортировать по

  • undefined / null / ложь значения date1 и сортировка их по низу,
  • date1 или при фальсификации 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; }
0 голосов
/ 06 июля 2019

Я использовал небольшой взлом, но, к сожалению, это заняло много времени! Чтобы установить для неопределенного и нулевого значения наибольшую дату в пределе, вычислите значение для каждого элемента и сравните!

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

var result = array.sort(function(obj1, obj2) {

    var copyObj1 = {...obj1},copyObj2 ={...obj2};
    var largestDate = '20121-12-31'

    copyObj1.date1 = copyObj1.date1 || largestDate
    copyObj2.date1 = copyObj2.date1 || largestDate

    var value1 = Object.values(copyObj1).join('')
    var value2 = Object.values(copyObj2).join('')
    return value1.localeCompare(value2)
})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...