JavaScript具有indexOf
和find
之类的数组方法,用于获取数组中符合条件的第一个元素。 indexOf
的对应对象是lastIndexOf
,它从数组的末尾开始搜索。我现在想知道是否有find
的副本从数组末尾开始,例如Ramda's findLast
的本机实现。
由于性能成本,我不希望使用array.slice().reverse().find()
,也不愿意使用for
循环,因为它很冗长,不符合函数式编程的精神
答案 0 :(得分:2)
没有,但是您可以轻松地对其进行填充:
Array.prototype.findLast = function(fn) {
for(let i = this.length - 1; i >= 0; i--)
if(fn( this[i], i, this )) return this[i];
return null;
};
console.log([5,4,3,2,1].findLast(el => el > 3));
答案 1 :(得分:2)
您可以使用X a = new X("param");
Y b = new Y(a);
Z c = new Z(b);
,这符合函数式编程的精神。但是,找到匹配项并没有reduceRight
循环中那样容易返回(but possible):
for
还有递归,它具有类似的效率问题(堆栈帧开销,没有瞬时提前返回,必须编写辅助函数或额外的条件,如果数组很大,则将栈炸掉)。
const lastIndexOf = (needle, haystack) =>
haystack.reduceRight((a, e, i) =>
a >= 0 ? a : e === needle ? i : -1
, -1)
;
const arr = [1,4,3,5,5,4,5];
console.log(lastIndexOf(4, arr));
console.log(lastIndexOf(2, arr));
答案 2 :(得分:1)
Lodash具有_.findLastIndex()方法,该方法从右到左遍历集合。 https://lodash.com/docs/4.17.10#findLastIndex
虽然不确定其性能