js数组some、includes、every、find方法
概览
some、every、find、includes 都是数组的“判断/查找”方法:
some():只要有一个满足条件就返回trueevery():所有元素都满足条件才返回truefind():返回第一个满足条件的元素(找不到则undefined)includes():判断是否包含指定值(返回true/false)
语法
1 | array.some((element, index, array) => boolean) |
some() 常见模式
判断是否存在符合条件的元素
1
2const nums = [1, 3, 5, 8]
const hasEven = nums.some(n => n % 2 === 0) // true对象数组中是否包含满足条件的项
1
2const users = [{id:1, role:'user'}, {id:2, role:'admin'}]
const hasAdmin = users.some(u => u.role === 'admin') // true
every() 常见模式
判断是否全部满足条件
1
2const scores = [80, 95, 88]
const allPass = scores.every(s => s >= 60) // true验证表单输入是否都非空
1
2const fields = ['张三', '13800000000', '上海']
const allFilled = fields.every(Boolean) // true
find() 常见模式
查找第一个匹配的元素(对象)
1
2const list = [{id:1, name:'A'}, {id:2, name:'B'}]
const item = list.find(x => x.id === 2) // {id:2, name:'B'}使用索引(场景:找第一个超过阈值的元素)
1
2const arr = [5, 9, 12]
const firstBig = arr.find((n, i) => n > 10 && i >= 1) // 12
includes() 常见模式
判断是否包含某值
1
2const tags = ['js', '数组', 'ES6']
const hasJs = tags.includes('js') // true指定起始位置
1
2
3
4const arr = [1, 2, 3, 2]
arr.includes(2) // true
arr.includes(2, 2) // true(从索引2开始,包含2)
arr.includes(2, 3) // false(从索引3开始)
返回值与差异对比
1 | const arr = [1, 2, 3, 4] |
容易踩坑(重点)
some/every/find回调必须return布尔值1
2
3
4
5
6
7
8
9const nums = [1, 2, 3]
// ❌ 忘记 return:回调返回 undefined,结果永远为 false / undefined
nums.some(n => { n > 2 }) // false
nums.find(n => { n > 2 }) // undefined
// ✅ 正确:显式或隐式 return
nums.some(n => n > 2) // true
nums.find(n => n > 2) // 3find()只返回“第一个匹配项”,不是所有匹配项1
2
3const arr = [1, 2, 3, 4]
arr.find(n => n % 2 === 0) // 2
// 若需要所有匹配项,用 filter()includes()与indexOf()的差异
includes()能正确处理NaN,indexOf()不能1
2
3const arr = [1, NaN, 3]
arr.includes(NaN) // true
arr.indexOf(NaN) // -1
includes()判断对象是“引用相等”,不是内容相等1
2
3
4
5const list = [{id:1}]
list.includes({id:1}) // false
const same = list[0]
list.includes(same) // true如果需要深入判断内容(如对象字段是否匹配),使用
some()+ 自定义条件:1
2const list2 = [{id:1, name:'A'}, {id:2, name:'B'}]
const hasId2 = list2.some(item => item.id === 2) // trueevery()在空数组上返回true1
[].every(x => x > 0) // true(空集合“全部满足”)
如果不希望这样,需先判断长度:
arr.length > 0 && arr.every(...)some()在空数组上返回false1
[].some(x => x > 0) // false
find()找不到返回undefined,别直接解构或调用属性1
2
3
4
5const users = [{id:1, name:'A'}]
const u = users.find(x => x.id === 2) // undefined
// ❌ u.name 会报错
// ✅ 使用可选链或默认值
const name = u?.name ?? '未知'
与 map/filter 的区别(快速对照)
1 | const arr = [1, 2, 3] |
实用小技巧
- 用
every(Boolean)快速判断全为真值 - 用
some()替代手写循环的“是否存在”逻辑 find()+??设置默认值:1
const user = list.find(u => u.id === id) ?? { id, name: '未命名' }
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 iehtian!
