(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);
此解决方案基本上基于您的建议。
首先,将值拆分为具有 season
和 year
的对象数组。然后按 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()
之后你几乎完成了
- 刚刚创建了
seasonObj
所有季节所需的排序顺序并合并 Array#map(), Destructuring assignment and Array#sort()
代码:
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)
季节需要按以下顺序排列: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);
此解决方案基本上基于您的建议。
首先,将值拆分为具有 season
和 year
的对象数组。然后按 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()
- 刚刚创建了
seasonObj
所有季节所需的排序顺序并合并 Array#map(), Destructuring assignment and Array#sort()
代码:
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)