(javascript) 如何对包含季节和年份的字符串数组进行排序?

(javascript) How to sort an array of strings that has seasons and years?

季节需要按以下顺序排列:Spring、夏季、秋季、冬季 每个季节都有 2025 年和 2026 年。

所有 2025 年都需要彼此在一起,所有 2026 年也需要彼此在一起(2025 年和 2026 年只是示例,年份可以是任何年份:1945、3005、7980 等)。

例如:

const seasonArr = ['Spring2026',' Spring2025','Summer2026','Summer2025','Fall2025','Fall2026','Winter2026','Winter2025']

let sortedArr = []

const someFunction = () => {
   ...
}

someFunction(seasonArr) // output: sortedArr = ['Spring2025', 'Summer2025', 'Fall2025', 'Winter2025', 'Spring2026', 'Summer2026', 'Fall2026', 'Winter2026']

我知道我可能必须比较年份,但由于它们是字符串,我很难只比较数字。

这是我想到的:

const seasonArr = ['Spring2026',' Spring2025','Summer2026','Summer2025','Fall2025','Fall2026','Winter2026','Winter2025']

let sortedArr = []

const someFunction = (seasonArr) => {
   for (const season of seasonArr) {
     let year = season.split(/([0-9]+)/)
     // unsure where to go from here
   }
}

someFunction(seasonArr)

我将字符串拆分为年份和季节,比较年份并比较相同年份的季节。我为订单使用了一系列季节。

const seasonArr = ['Spring2026','Spring2025','Summer2026','Summer2025','Fall2025','Fall2026','Winter2026','Winter2025'];

const seasons = ['Spring', 'Summer', 'Fall', 'Winter'];

const regexp = /(.+)(\d{4})/;
const someFunction = (s) => {
   return [...s].sort((lhs, rhs) => {
     const [seasonL, yearL] = regexp.exec(lhs).slice(1);
     const [seasonR, yearR] = regexp.exec(rhs).slice(1);
     return +yearL - +yearR || seasons.indexOf(seasonL) - seasons.indexOf(seasonR);
   });
}

let sortedArr = someFunction(seasonArr);
console.log(sortedArr);

我用

创建了一个浅拷贝
[...s]

保持原数组不变

相同的逻辑,但大型数组的性能更好

const seasonArr = ['Spring2026','Spring2025','Summer2026','Summer2025','Fall2025','Fall2026','Winter2026','Winter2025'];

const seasons = ['Spring', 'Summer', 'Fall', 'Winter'];

const regexp = /(.+)(\d{4})/;
const someFunction = (s) => {
   return s
     .map(el => {
       const [season, year] = regexp.exec(el).slice(1);
       return [season, year, seasons.indexOf(season[0])];
     })
     .sort((lhs, rhs) => {
       return +lhs[1] - +rhs[1] || lhs[2] - rhs[2];
     })
     .map(el => el[0] + el[1]);
}

let sortedArr = someFunction(seasonArr);
console.log(sortedArr);

此解决方案基本上基于您的建议。

首先,将值拆分为具有 seasonyear 的对象数组。然后按 year 和季节索引排序。然后把这些值放回去。


const seasonArr = ['Spring2026',' Spring2025','Summer2026','Summer2025','Fall2025','Fall2026','Winter2026','Winter2025']

const SEASONS = ["Spring", "Summer", "Fall", "Winter"]

function comparator(a, b) {
  if (a.year == b.year) {
    const aSeasonIndex = SEASONS.indexOf(a.season)
    const bSeasonIndex = SEASONS.indexOf(b.season)
    return aSeasonIndex - bSeasonIndex;
  }
  return a.year - b.year;
}

function seasonYearToObject(obj) {
  const matches = obj.match(/([^\d]*)(\d+)/)
  if (matches) {
    return {season: matches[1], year: matches[2]}
  }
}

function objectToSeasonYear(obj) {
  return `${obj.season}${obj.year}`
}
  
function sortByYearAndSeason(arr) {
  return arr
    .map(entry => seasonYearToObject(entry))
    .sort(comparator)
    .map(objectToSeasonYear);
}

console.log (sortByYearAndSeason(seasonArr))

season.split(/([0-9]+)/)String#split()

之后你几乎完成了

代码:

const seasonArr = ['Spring2026', 'Spring2025', 'Summer2026', 'Summer2025', 'Fall2025', 'Fall2026', 'Winter2026', 'Winter2025']
const seasonObj = { Spring: 0, Summer: 1, Fall: 2, Winter: 3 }

const result = seasonArr
  .map((season) => season.split(/([0-9]+)/))
  .sort(([aSeason, aYear], [bSeason, bYear]) =>
      +aYear - bYear || seasonObj[aSeason] - seasonObj[bSeason])
  .map(([season, year]) => `${season}${year}`)

console.log(result)