当前位置: 首页 > 科技观察

新的JavaScript函数:findLast()和findLastIndex()

时间:2023-03-23 11:03:35 科技观察

今天看一个ECMAScript提案:findLast()和findLastIndex()。提案理由在JavaScript中,可以使用find()和findIndex()来查找数组中的值。然而,这些方法从数组的开头开始遍历:constarray=[{v:1},{v:2},{v:3},{v:4},{v:5}];array.find(elem=>elem.v>3);//{v:4}array.findIndex(elem=>elem.v>3);//3如果要从数组的末尾开始遍历,就得把数组倒过来,用上面的方法。这样做需要额外的数组操作。基本用法幸运的是,WenluWang和DanielRosenwasser针对findLast()和findLastIndex()的ECMAScript提议解决了这个问题。这个提议的一个重要原因是:语义。它们的用法类似于find()和findIndex(),只是它们是从后往前遍历数组。这两种方法适用于数组和类数组。findLast()将返回第一个找到的元素,如果没有找到则返回undefined;findLastIndex()将返回第一个找到的元素的索引。如果没有找到,则返回-1;constarray=[{v:1},{v:2},{v:3},{v:4},{v:5}];array.findLast(elem=>elem.v>3);//{v:5}array.findLastIndex(elem=>elem.v>3);//4array.findLastIndex(elem=>elem.v>5);//-1简单实现让我们简单地实现这两个方法。findLast()functionfindLast(arr,callback,thisArg){for(letindex=arr.length-1;index>=0;index--){constvalue=arr[index];}if(callback.call(thisArg,value,index,arr)){返回值;}}returnundefined;}constarray=[{v:1},{v:2},{v:3},{v:4},{v:5}];findLast(array,elem=>elem.v>3,array)//{v:5}findLast(array,elem=>elem.v>5,array)//-1findLastIndex()函数findLastIndex(arr,callback,thisArg){for(letindex=arr.length-1;index>=0;index--){constvalue=arr[index];if(callback.call(thisArg,value,index,arr)){返回索引;}}return-1;}constarray=[{v:1},{v:2},{v:3},{v:4},{v:5}];findLastIndex(array,elem=>elem.v>3,array)//4findLastIndex(array,elem=>elem.v>5,array)//-1lodash源码下面是lodash实现这两个方法的源码,供大家学习!findLast()importfindLastIndexfrom'./findLastIndex.js'从'./isArrayLike.js'导入isArrayLike/***此方法类似于`find`,只是它从右到左遍历*`collection`的元素。**@since2.0.0*@categoryCollection*@param{Array|Object}collection要检查的集合。*@param{Function}predicate每次迭代调用的函数。*@param{number}[fromIndex=collection.length-1]要搜索的索引。*@returns{*}返回匹配的元素,否则返回`undefined`。*@seefind、findIndex、findKey、findLastIndex、findLastKey*@example**findLast([1,2,3,4],n=>n%2==1)*//=>3*/functionfindLast(collection,predicate,fromIndex){letiterateeconstiterable=Object(collection)if(!isArrayLike(collection)){collection=Object.keys(collection)iteratee=predicatepredicate=(key)=>iteratee(iterable[key],key,iterable)}constindex=findLastIndex(collection,predicate,fromIndex)returnindex>-1?可迭代[迭代?集合[索引]:索引]:未定义ed}exportdefaultfindLastfindLastIndex()importbaseFindIndexfrom'./.internal/baseFindIndex.js'importtoIntegerfrom'./toInteger.js'/***这个方法类似于`findIndex`除了它迭代元素*of`集合`从右到左。**@since2.0.0*@categoryArray*@param{Array}array要检查的数组。*@param{Function}predicate每次迭代调用的函数。*@param{number}[fromIndex=array.length-1]要搜索的索引。*@returns{number}返回找到的元素的索引,否则为“-1”。*@seefind、findIndex、findKey、findLast、findLastKey*@example**constusers=[*{'user':'barney','active':true},*{'user':'fred','active':false},*{'user':'pebbles','active':false}*]**findLastIndex(users,({user})=>user=='pebbles')*//=>2*/functionfindLastIndex(array,predicate,fromIndex){constlength=array==null?0:array.lengthif(!length){返回n-1}letindex=length-1if(fromIndex!==undefined){index=toInteger(fromIndex)index=fromIndex<0?Math.max(length+index,0):Math.min(index,length-1)}returnbaseFindIndex(array,predicate,index,true)}exportdefaultfindLastIndexAvailability该提案目前处于第三阶段,提案地址:https://github.com/tc39/proposal-array-find-from-last此外,Lodash和Ramda等库提供了数组的findLast()和findLastIndex()操作。目前,Safari15.4已经支持这两种方式。期待更多的浏览器支持这两种方式!

最新推荐
猜你喜欢