为了账号安全,请及时绑定邮箱和手机立即绑定

Array.sort() 比较函数返回未定义

Array.sort() 比较函数返回未定义

慕的地10843 2021-06-01 13:50:49
我正在尝试从最旧到最新对字符串日期数组进行排序。我设置了几个比较函数,但控制台说的a是undefined. 出了什么问题?//Sort an array of dates in this formatconst 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 formatconst cleanedDates = dates.filter(date => date.length === 11);//isolate the day, convert to numberconst getDay = (str) => {  return parseInt(str.slice(0,2));};//create a dictionary of monthsconst 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 dictionaryconst getMonth = (str) => {  const month = str.slice(3,6);  return monthDict[month];};//get the year, convert to numberconst getYear = (str) => {  return parseInt(str.slice(7));}//comparison helper functions//compare dayconst 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 monthconst 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 yearconst 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 arrayconst sortedArray = cleanedDates.sort((a,b) => compareYear(a,b));console.log(sortedArray);
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

你的语法不正确。其余的对我有用:)。,当您const date对 value进行操作时,您会错过一个22 Sep 1902。}当你执行 else if 时,两个位置有额外的。


修复这将使它工作:


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


查看完整回答
反对 回复 2021-06-03
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

清理日期数组并且没有语法错误后,试试这个:


// convert to date

dates.map( el => new Date(el));

// sort it

dates.sort( (a,b) => a>b);


查看完整回答
反对 回复 2021-06-03
  • 2 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信