各位观众,欢迎来到今天的JavaScript内核与高级编程小讲堂!今天咱们聊点儿新鲜的——Array.prototype.findLast()
,这玩意儿可是数组搜索家族里的一位新成员,让咱们看看它能带来什么惊喜。
开场白:数组搜索的那些事儿
在JavaScript的世界里,数组这东西,那是相当常见。咱们经常需要在数组里找点儿什么,比如找到第一个大于某个值的元素,或者找到符合某种条件的元素。以前,咱们可能会用for
循环,或者Array.prototype.find()
之类的。但现在,findLast()
来了,它要做什么呢?简单来说,就是从数组的末尾开始搜索。
find()
的老朋友,findLast()
的新面孔
Array.prototype.find()
,各位肯定不陌生。它从数组的开头开始,找到第一个符合条件的元素,然后就停止搜索。如果没找到,就返回undefined
。
const numbers = [5, 12, 8, 130, 44];
const found = numbers.find(element => element > 10);
console.log(found); // 输出: 12
findLast()
呢?它就像find()
的逆向版本。它从数组的末尾开始,找到第一个符合条件的元素。
const numbers = [5, 12, 8, 130, 44];
const found = numbers.findLast(element => element > 10);
console.log(found); // 输出: 130
看到区别了吧?find()
找到的是12,而findLast()
找到的是130。
findLast()
的语法结构
findLast()
的语法很简单,和find()
几乎一模一样:
Array.prototype.findLast(callbackFn[, thisArg])
callbackFn
:这是一个回调函数,用来测试数组中的每个元素。它接受三个参数:element
:当前正在处理的元素。index
(可选):当前元素的索引。array
(可选):调用findLast()
的数组本身。callbackFn
应当返回一个真值来指示找到了匹配的元素。 一旦找到,函数将返回该元素的值并停止迭代;否则,返回undefined
。
thisArg
(可选):执行callbackFn
时用作this
的值。
findLast()
的使用场景:举几个栗子
findLast()
在某些情况下会非常有用。比如,你需要找到数组中最后一个满足特定条件的元素。以下是一些例子:
-
查找最后一个符合条件的订单:
假设你有一个订单数组,每个订单都有一个
status
属性。你需要找到最后一个状态为"completed"的订单。const orders = [ { id: 1, status: 'pending' }, { id: 2, status: 'completed' }, { id: 3, status: 'pending' }, { id: 4, status: 'completed' }, ]; const lastCompletedOrder = orders.findLast(order => order.status === 'completed'); console.log(lastCompletedOrder); // 输出: { id: 4, status: 'completed' }
-
查找最后一个小于某个值的元素:
假设你有一个数字数组,你需要找到最后一个小于10的数字。
const numbers = [12, 5, 8, 15, 3]; const lastLessThanTen = numbers.findLast(number => number < 10); console.log(lastLessThanTen); // 输出: 3
-
查找最后一个包含特定字符的字符串:
假设你有一个字符串数组,你需要找到最后一个包含字母"a"的字符串。
const strings = ['banana', 'apple', 'orange', 'grape']; const lastWithA = strings.findLast(str => str.includes('a')); console.log(lastWithA); // 输出: 'grape'
-
日志分析场景:
在一个日志记录数组中,你可能需要查找最后一个错误日志。
const logs = [ { timestamp: '2023-10-26T10:00:00', level: 'info', message: 'Application started' }, { timestamp: '2023-10-26T10:05:00', level: 'warning', message: 'Low memory' }, { timestamp: '2023-10-26T10:10:00', level: 'error', message: 'Database connection failed' }, { timestamp: '2023-10-26T10:15:00', level: 'info', message: 'User login successful' } ]; const lastErrorLog = logs.findLast(log => log.level === 'error'); console.log(lastErrorLog); // 输出: { timestamp: '2023-10-26T10:10:00', level: 'error', message: 'Database connection failed' }
findLastIndex()
:找到索引也重要
和find()
对应的是findIndex()
一样,findLast()
也有一个小伙伴,叫做findLastIndex()
。它不是返回元素本身,而是返回最后一个符合条件的元素的索引。如果没找到,就返回-1。
const numbers = [5, 12, 8, 130, 44];
const lastIndex = numbers.findLastIndex(element => element > 10);
console.log(lastIndex); // 输出: 4 (44 的索引)
findLast()
vs. find()
:选择哪个?
什么时候用findLast()
,什么时候用find()
呢?这取决于你的需求。
- 如果你需要找到第一个符合条件的元素,用
find()
。 - 如果你需要找到最后一个符合条件的元素,用
findLast()
。
简单来说,如果数组中只有一个满足条件的元素,用哪个都一样。但如果数组中有多个满足条件的元素,那么find()
会返回第一个,而findLast()
会返回最后一个。
性能考量:谁更快?
从理论上讲,findLast()
和find()
的性能应该差不多。它们都是线性搜索,最坏的情况下需要遍历整个数组。但是,在某些情况下,findLast()
可能会更快。
比如,如果你知道符合条件的元素很可能出现在数组的末尾,那么用findLast()
可以更快地找到目标元素,因为它不需要从头开始搜索。
兼容性问题:别踩坑
findLast()
和findLastIndex()
是比较新的特性,并不是所有的浏览器都支持。截至我写这篇文章时,它们已经被 Chrome 97+, Edge 97+, Firefox 91+, Safari 15.2+ 和 Node.js 18+ 支持。
如果你的目标用户使用的浏览器版本比较老,那么你需要使用polyfill来提供兼容性。你可以使用core-js库来polyfill这些方法。
// 引入 core-js 的 findLast 和 findLastIndex polyfill
import 'core-js/features/array/find-last';
import 'core-js/features/array/find-last-index';
// 现在你就可以在旧版本浏览器中使用 findLast 和 findLastIndex 了
const numbers = [5, 12, 8, 130, 44];
const found = numbers.findLast(element => element > 10);
console.log(found); // 输出: 130
与filter
的比较:不同的搜索策略
你可能会想,findLast()
和filter()
有什么区别?它们都可以用来查找数组中的元素。
findLast()
:找到最后一个符合条件的元素,然后就停止搜索。返回的是一个元素。filter()
:找到所有符合条件的元素,然后返回一个新的数组,包含所有符合条件的元素。
所以,如果你只需要找到一个元素,那么用findLast()
更高效。如果你需要找到所有符合条件的元素,那么用filter()
。
代码实战:一个更复杂的例子
让我们来看一个更复杂的例子,展示findLast()
的威力。
假设你有一个产品数组,每个产品都有一个name
、price
和category
属性。你需要找到最后一个价格低于100且属于"electronics"类别的产品。
const products = [
{ name: 'Laptop', price: 1200, category: 'electronics' },
{ name: 'Headphones', price: 80, category: 'electronics' },
{ name: 'T-shirt', price: 20, category: 'clothing' },
{ name: 'Smartwatch', price: 200, category: 'electronics' },
{ name: 'Keyboard', price: 75, category: 'electronics' },
];
const lastCheapElectronics = products.findLast(product => product.price < 100 && product.category === 'electronics');
console.log(lastCheapElectronics); // 输出: { name: 'Keyboard', price: 75, category: 'electronics' }
总结:findLast()
的价值
Array.prototype.findLast()
是JavaScript数组搜索的一个有用的补充。它可以让你从数组的末尾开始搜索,找到最后一个符合条件的元素。在某些情况下,它可以比find()
更高效。但是,你需要注意兼容性问题,并根据你的具体需求选择合适的搜索方法。
表格总结:各种搜索方法的对比
方法 | 搜索方向 | 返回值 | 找到多个元素? | 兼容性 | 用途 |
---|---|---|---|---|---|
find() |
从头开始 | 第一个元素 | 否 | 广泛 | 查找第一个符合条件的元素 |
findIndex() |
从头开始 | 第一个元素的索引 | 否 | 广泛 | 查找第一个符合条件的元素的索引 |
findLast() |
从末尾开始 | 最后一个元素 | 否 | 较新 | 查找最后一个符合条件的元素 |
findLastIndex() |
从末尾开始 | 最后一个元素的索引 | 否 | 较新 | 查找最后一个符合条件的元素的索引 |
filter() |
从头开始 | 符合条件的数组 | 是 | 广泛 | 查找所有符合条件的元素 |
展望未来:JavaScript的进化
JavaScript一直在不断进化,新的特性层出不穷。findLast()
只是其中之一。作为开发者,我们需要不断学习新的知识,掌握新的技能,才能更好地应对未来的挑战。
好了,今天的讲堂就到这里。希望大家有所收获!下次再见!