[ PROMPT_NODE_27954 ]
js-min-max-loop
[ SKILL_DOCUMENTATION ]
## 使用循环查找最大/最小值而非排序
查找数组中的最小或最大元素只需要对数组进行一次遍历。排序是浪费且缓慢的。
**错误做法 (O(n log n) - 通过排序查找最新项):**
typescript
interface Project {
id: string
name: string
updatedAt: number
}
function getLatestProject(projects: Project[]) {
const sorted = [...projects].sort((a, b) => b.updatedAt - a.updatedAt)
return sorted[0]
}
仅仅为了找到最大值而对整个数组进行排序。
**错误做法 (O(n log n) - 通过排序查找最旧和最新项):**
typescript
function getOldestAndNewest(projects: Project[]) {
const sorted = [...projects].sort((a, b) => a.updatedAt - b.updatedAt)
return { oldest: sorted[0], newest: sorted[sorted.length - 1] }
}
在只需要最大/最小值时进行了不必要的排序。
**正确做法 (O(n) - 单次循环):**
typescript
function getLatestProject(projects: Project[]) {
if (projects.length === 0) return null
let latest = projects[0]
for (let i = 1; i latest.updatedAt) {
latest = projects[i]
}
}
return latest
}
function getOldestAndNewest(projects: Project[]) {
if (projects.length === 0) return { oldest: null, newest: null }
let oldest = projects[0]
let newest = projects[0]
for (let i = 1; i < projects.length; i++) {
if (projects[i].updatedAt newest.updatedAt) newest = projects[i]
}
return { oldest, newest }
}
对数组进行单次遍历,无需复制,无需排序。
**替代方案 (针对小数组使用 Math.min/Math.max):**
typescript
const numbers = [5, 2, 8, 1, 9]
const min = Math.min(...numbers)
const max = Math.max(...numbers)
这适用于小数组,但对于非常大的数组,由于展开运算符的限制,速度可能会变慢。为了可靠性,请使用循环方法。