首页 > 解决方案 > Array.sort() 比较函数返回未定义

问题描述

我正在尝试从最旧到最新对字符串日期数组进行排序。我设置了几个比较功能,但控制台说a的是undefined. 出了什么问题?

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

标签: javascript

解决方案


你的语法不正确。其余的对我有用:)。,当您const date对 value进行操作时,您会丢失 a 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);


推荐阅读