1

I have an array of objects, I want to sort this array according to date which is in string format. The problem is this array can have blank values for a date, the code I am using works for array without blank values, but with blank values, it doesn't return properly sorted array.

This is array eg-

  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"
  
}]

The code I am using is -

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

The expected result-

[{
  _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"
}]

This is the link for jsfiddle JS Fiddle Code

pse
  • 141
  • 1
  • 10

5 Answers5

2

When date is empty, the resultant date object is "Invalid Date" ... so, the easiest remedy, and to move empty dates to the end

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

same for dateB

Note the + before new, to get a Number, an invalid date results in NaN ... and NaN || Number.MAX_SAFE_INTEGER === Number.MAX_SAFE_INTEGER

You could use Infinity too - anything that is a LARGE number will do

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)
Jaromanda X
  • 53,868
  • 5
  • 73
  • 87
2
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(", "));

Do Somthing Like This:

https://jsfiddle.net/p3f8xq46/

Maharshi
  • 31
  • 5
1

You need to capture this case separatly. Return -1 if the b Date is empty string or does not exists:

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

Another option is to check if the Date is valid but this would only work if it is an empty string.

You could also check your result for validity using isNaN()

R. Keller
  • 100
  • 7
1

You could take the delta of the wanted negated property and move falsy values to bottom.

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; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
1

Check the validity of date object and run the code return the value I have done a similar thing below for you

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)
pavan kumar
  • 823
  • 6
  • 15