javascript сортировка массива объектов по дате в строке с некоторыми нулевыми значениями

У меня есть массив объектов, я хочу отсортировать этот массив по дате в строковом формате. Проблема в том, что этот массив может иметь пустые значения для даты, код, который я использую, работает для массива без пустых значений, но с пустыми значениями он не возвращает правильно отсортированный массив.

Это массив, например

  var array =
[{
    "_id" : "5f6a0c223932cd1f7ae1d48c",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Fri Oct 16 2020 00:00:00"
},
{
    "_id" : "5f6990b94130056cd6034091",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : ""
 
},
{
    "_id" : "5f6a0c2a3932cd1f7ae1d48d",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Fri Nov 27 2020 00:00:00"
    
},

{
    "_id" : "5f6a0c453932cd1f7ae1d48e",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Thu Oct 22 2020 00:00:00"
},

{
    "_id" : "5f6a0c4d3932cd1f7ae1d48f",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Thu Nov 19 2020 00:00:00"
  
},

{
    "_id" : "5f6a0c5a3932cd1f7ae1d490",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Thu Dec 03 2020 00:00:00"
    
},

{
    "_id" : "5f1bd948a1db382540356394",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Mon Jul 13 2020 20:30:00"
   
},
{
    "_id" : "5f698ca54130056cd603408e",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Fri Sep 25 2020 00:00:00"
   
},
{
    "_id" : "5f698cae4130056cd603408f",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1", 
    "current_term_renewal_date" : "Thu Sep 24 2020 00:00:00"
   
},
{
    "_id" : "5f698cb64130056cd6034090",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date" : "Wed Sep 23 2020 00:00:00"
   
},

{
    "_id" : "5f6a0c163932cd1f7ae1d48b",
    "user_id" : "5e82f6d1ca6f2a3b4d2212a1", 
    "current_term_renewal_date" : "Sun Nov 08 2020 00:00:00"
  
}]

Код, который я использую, -

  array.sort(function compare(a, b) {
            var dateA = new Date(a.current_term_renewal_date);
            var dateB = new Date(b.current_term_renewal_date);
            return dateA - dateB;
        });

Ожидаемый результат-

[{
  _id: "5f1bd948a1db382540356394",
  current_term_renewal_date: "Mon Jul 13 2020 20:30:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f698cb64130056cd6034090",
  current_term_renewal_date: "Wed Sep 23 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f698cae4130056cd603408f",
  current_term_renewal_date: "Thu Sep 24 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f698ca54130056cd603408e",
  current_term_renewal_date: "Fri Sep 25 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6a0c223932cd1f7ae1d48c",
  current_term_renewal_date: "Fri Oct 16 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6a0c453932cd1f7ae1d48e",
  current_term_renewal_date: "Thu Oct 22 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6a0c163932cd1f7ae1d48b",
  current_term_renewal_date: "Sun Nov 08 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6a0c4d3932cd1f7ae1d48f",
  current_term_renewal_date: "Thu Nov 19 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6a0c2a3932cd1f7ae1d48d",
  current_term_renewal_date: "Fri Nov 27 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6a0c5a3932cd1f7ae1d490",
  current_term_renewal_date: "Thu Dec 03 2020 00:00:00",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}, {
  _id: "5f6990b94130056cd6034091",
  current_term_renewal_date: "",
  user_id: "5e82f6d1ca6f2a3b4d2212a1"
}]

Это ссылка на jsfiddle JS Fiddle Code


person pse    schedule 23.09.2020    source источник
comment
Проблема в элементе без даты   -  person Jaromanda X    schedule 23.09.2020


Ответы (5)


Проверьте правильность объекта даты и запустите код, возвращающий значение, которое я сделал для вас аналогично ниже.

var array = [{
    "_id": "5f6a0c223932cd1f7ae1d48c",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Fri Oct 16 2020 00:00:00"
  },
  {
    "_id": "5f6990b94130056cd6034091",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": ""

  },
  {
    "_id": "5f6a0c2a3932cd1f7ae1d48d",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Fri Nov 27 2020 00:00:00"

  },

  {
    "_id": "5f6a0c453932cd1f7ae1d48e",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Oct 22 2020 00:00:00"
  },

  {
    "_id": "5f6a0c4d3932cd1f7ae1d48f",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Nov 19 2020 00:00:00"

  },

  {
    "_id": "5f6a0c5a3932cd1f7ae1d490",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Dec 03 2020 00:00:00"

  },

  {
    "_id": "5f1bd948a1db382540356394",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Mon Jul 13 2020 20:30:00"

  },
  {
    "_id": "5f698ca54130056cd603408e",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Fri Sep 25 2020 00:00:00"

  },
  {
    "_id": "5f698cae4130056cd603408f",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Sep 24 2020 00:00:00"

  },
  {
    "_id": "5f698cb64130056cd6034090",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Wed Sep 23 2020 00:00:00"

  },

  {
    "_id": "5f6a0c163932cd1f7ae1d48b",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Sun Nov 08 2020 00:00:00"

  }
]
array.sort(function compare(a, b) {
  var dateA = new Date(a.current_term_renewal_date);
  var dateB = new Date(b.current_term_renewal_date);
  if (!dateA.toJSON()) {
    return 1;
  }
  if (!dateB.toJSON()) {
    return -1;
  }
  return dateA - dateB;
});
console.log("result", array)

person pavan kumar    schedule 23.09.2020

Когда дата пуста, результирующий объект даты является недействительной датой... так что самое простое средство и переместить пустые даты в конец

var dateA = +new Date(a.current_term_renewal_date) || Number.MAX_SAFE_INTEGER;

то же самое для даты B

Обратите внимание на + перед новым, чтобы получить число, недопустимая дата приводит к NaN ... и NaN || Number.MAX_SAFE_INTEGER === Number.MAX_SAFE_INTEGER

Вы также можете использовать Infinity — подойдет любое БОЛЬШОЕ число.

var array = [{
    "_id": "5f6a0c223932cd1f7ae1d48c",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Fri Oct 16 2020 00:00:00"
  },
  {
    "_id": "5f6990b94130056cd6034091",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": ""

  },
  {
    "_id": "5f6a0c2a3932cd1f7ae1d48d",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Fri Nov 27 2020 00:00:00"

  },

  {
    "_id": "5f6a0c453932cd1f7ae1d48e",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Oct 22 2020 00:00:00"
  },

  {
    "_id": "5f6a0c4d3932cd1f7ae1d48f",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Nov 19 2020 00:00:00"

  },

  {
    "_id": "5f6a0c5a3932cd1f7ae1d490",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Dec 03 2020 00:00:00"

  },

  {
    "_id": "5f1bd948a1db382540356394",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Mon Jul 13 2020 20:30:00"

  },
  {
    "_id": "5f698ca54130056cd603408e",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Fri Sep 25 2020 00:00:00"

  },
  {
    "_id": "5f698cae4130056cd603408f",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Thu Sep 24 2020 00:00:00"

  },
  {
    "_id": "5f698cb64130056cd6034090",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Wed Sep 23 2020 00:00:00"

  },

  {
    "_id": "5f6a0c163932cd1f7ae1d48b",
    "user_id": "5e82f6d1ca6f2a3b4d2212a1",
    "current_term_renewal_date": "Sun Nov 08 2020 00:00:00"

  }
]
array.sort(function compare(a, b) {
  var dateA = +new Date(a.current_term_renewal_date) || Number.MAX_SAFE_INTEGER;
  var dateB = +new Date(b.current_term_renewal_date) || Number.MAX_SAFE_INTEGER;
  return dateA - dateB;
});
console.log("result", array)

person Jaromanda X    schedule 23.09.2020

for (var idx in array)
{
    var row = array[idx];
    if (!row.current_term_renewal_date)
    {
        row.sortable = 0;
        continue;
    }
    var date = row.current_term_renewal_date.split('/');
    row.sortable = 10000 * parseInt(date[2]) + 100 * parseInt(date[0]) + parseInt(date[1]); // year, month, day
}

array.sort(function(a, b)
{
    return a.sortable > b.sortable ? 1 : a.sortable < b.sortable ? -1 : 0;
});

var result = [];
for (var idx=0; idx < array.length; idx++)
    result.push(array[idx].current_term_renewal_date);

console.log(result.join(", "));

Сделайте что-нибудь вроде этого:

https://jsfiddle.net/p3f8xq46/

person Maharshi    schedule 23.09.2020

Вам нужно зафиксировать этот случай отдельно. Вернуть -1, если дата b является пустой строкой или не существует:

if (!b.current_term_renewal_date || b.current_term_renewal_date === '') return -1;

Другой вариант — проверить, действительна ли дата, но это будет работать, только если это пустая строка.

Вы также можете проверить свой результат на достоверность, используя isNaN()

person R. Keller    schedule 23.09.2020
comment
что, если a имеет пустую дату? - person Jaromanda X; 23.09.2020

Вы можете взять дельту желаемого инвертированного свойства и переместить ложные значения вниз.

const
    array = [{ _id: "5f6a0c223932cd1f7ae1d48c", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Fri Oct 16 2020 00:00:00" }, { _id: "5f6990b94130056cd6034091", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "" }, { _id: "5f6a0c2a3932cd1f7ae1d48d", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Fri Nov 27 2020 00:00:00" }, { _id: "5f6a0c453932cd1f7ae1d48e", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Thu Oct 22 2020 00:00:00" }, { _id: "5f6a0c4d3932cd1f7ae1d48f", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Thu Nov 19 2020 00:00:00" }, { _id: "5f6a0c5a3932cd1f7ae1d490", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Thu Dec 03 2020 00:00:00" }, { _id: "5f1bd948a1db382540356394", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Mon Jul 13 2020 20:30:00" }, { _id: "5f698ca54130056cd603408e", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Fri Sep 25 2020 00:00:00" }, { _id: "5f698cae4130056cd603408f", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Thu Sep 24 2020 00:00:00" }, { _id: "5f698cb64130056cd6034090", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Wed Sep 23 2020 00:00:00" }, { _id: "5f6a0c163932cd1f7ae1d48b", user_id: "5e82f6d1ca6f2a3b4d2212a1", current_term_renewal_date: "Sun Nov 08 2020 00:00:00" }]

array.sort((a, b) => {
  const 
      dateA = new Date(a.current_term_renewal_date),
      dateB = new Date(b.current_term_renewal_date);

  return !a.current_term_renewal_date - !b.current_term_renewal_date
      || dateA - dateB;
});

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

person Nina Scholz    schedule 23.09.2020