简体   繁体   中英

Array.sort() compare function returns undefined

I am trying to sort an array of string dates from oldest to newest. I set up a couple of compare functions, but the console is saying a is undefined . What is going wrong?

//Sort an array of dates in this format
const dates = [
'10',
'23 Apr 2018',
'01 Jun 1943',
'05 Aug 2055',
'22 Sep 1902'
'18 Aug 1970',
'01 Jan 1940',
'08 Mar 2018',
'11 Feb 1982',
'17 Mar 1927',  
];

//remove the data that is not in the correct format
const cleanedDates = dates.filter(date => date.length === 11);

//isolate the day, convert to number
const getDay = (str) => {
  return parseInt(str.slice(0,2));
};

//create a dictionary of months
const monthDict = {
  Jan: 1,
  Feb: 2,
  Mar: 3,
  Apr: 4,
  May: 5,
  Jun: 6,
  Jul: 7,
  Aug: 8,
  Sep: 9,
  Oct: 10,
  Nov: 11,
  Dec: 12
};

//get the month value via dictionary
const getMonth = (str) => {
  const month = str.slice(3,6);
  return monthDict[month];
};

//get the year, convert to number
const getYear = (str) => {
  return parseInt(str.slice(7));
}

//comparison helper functions

//compare day
const compareDay = (a,b) => {
  if (getDay(a) < getDay(b)) {
    return -1;
  } else if (getDay(a) === getDay(b)) {
    return 0;
  }
  } else if (getDay(a) > getDay(b)) {
    return 1;
  }
};

//compare month
const compareMonth = (a,b) => {
  if (getMonth(a) < getMonth(b)) {
    return -1
  } else if (getMonth(a) === getMonth(b)) {
    compareDay(a,b);
  } else if (getMonth(a) > getMonth(b)) {
    return 1;
  }
};

//compare year
const compareYear = (a,b) => {
  if (getYear(a) < getYear(b)) {
    return -1;
  } else if (getYear(a) === getYear(b)) {
    compareMonth(a,b);
  }
  } else if (getYear(a) > getYear(b)) {
    return 1
  }
};

//sort array
const sortedArray = cleanedDates.sort((a,b) => compareYear(a,b));

console.log(sortedArray);

your syntax is incorrect. The rest is working for me :). you are missing a , when you do const date on the value 22 Sep 1902 . And there are extra } on two locations when you do an else if.

Fixing that will get it working:

 //Sort an array of dates in this format const dates = [ '10', '23 Apr 2018', '01 Jun 1943', '05 Aug 2055', '22 Sep 1902', '18 Aug 1970', '01 Jan 1940', '08 Mar 2018', '11 Feb 1982', '17 Mar 1927' ]; //remove the data that is not in the correct format const cleanedDates = dates.filter(date => date.length === 11); //isolate the day, convert to number const getDay = (str) => { return parseInt(str.slice(0, 2)); }; //create a dictionary of months const monthDict = { Jan: 1, Feb: 2, Mar: 3, Apr: 4, May: 5, Jun: 6, Jul: 7, Aug: 8, Sep: 9, Oct: 10, Nov: 11, Dec: 12 }; //get the month value via dictionary const getMonth = (str) => { const month = str.slice(3, 6); return monthDict[month]; }; //get the year, convert to number const getYear = (str) => { return parseInt(str.slice(7)); } //comparison helper functions //compare day const compareDay = (a, b) => { if (getDay(a) < getDay(b)) { return -1; } else if (getDay(a) === getDay(b)) { return 0; } else if (getDay(a) > getDay(b)) { return 1; } }; //compare month const compareMonth = (a, b) => { if (getMonth(a) < getMonth(b)) { return -1 } else if (getMonth(a) === getMonth(b)) { compareDay(a, b); } else if (getMonth(a) > getMonth(b)) { return 1; } }; //compare year const compareYear = (a, b) => { if (getYear(a) < getYear(b)) { return -1; } else if (getYear(a) === getYear(b)) { compareMonth(a, b); } else if (getYear(a) > getYear(b)) { return 1 } }; //sort array const sortedArray = cleanedDates.sort((a, b) => compareYear(a, b)); console.log(sortedArray); 

After cleaning the dates array and there is no syntax error, try this:

// convert to date
dates.map( el => new Date(el));
// sort it
dates.sort( (a,b) => a>b);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM