首页 > 解决方案 > 从非零元素开始使用 findIndex()

问题描述

我想在从非零元素开始的数组上使用 findIndex() 。我已经编写了以下代码,它对我有用,但有更清洁的解决方案吗?

let desiredLastElementIndex = refundRequests.map((e,i) =>{
    if(i<numberOfTickets){
        return 0
    }else{
        return Math.round(e.purchasersMinimumPrice - refundRequests[i-1].purchasersMinimumPrice)
        }
        }).findIndex((e, i) => findIndex((e, i) => e !== 0)

例如,当使用 indexOf 时,我可以将要开始的索引作为第二个参数传递。

理想情况下,我想做类似...

    let desiredLastElementIndex = refundRequests.findIndex((e, i) => {
     e.purchasersMinimumPrice !== refundRequests[i+1].purchasersMinimumPrice
}, INDEXTOSTARTFROM) + 1

标签: javascript

解决方案


fromIndex()您可以在将回调函数传递给Array.prototype.find()or之前定义一个调用来包装回调函数的辅助方法Array.prototype.findIndex()。它可以包装回调的其他函数是Array.prototype.filter()Array.prototype.forEach()Array.prototype.some()

function fromIndex(cb, index) {
  return function (e, i, a) {
    return i >= index && cb.call(this, e, i, a);
  };
}

const array = [3, 7, 5, 1, 9];
const f = element => element > 4;

console.log(`value ${array.find(f)} index ${array.findIndex(f)}`);
console.log(`value ${array.find(fromIndex(f, 3))} index ${array.findIndex(fromIndex(f, 3))}`);

在您的示例中,用法如下所示:

let desiredLastElementIndex = refundRequests.findIndex(fromIndex((e, i) => {
  e.purchasersMinimumPrice !== refundRequests[i + 1].purchasersMinimumPrice
}, INDEXTOSTARTFROM)) + 1

find()为了获得更多乐趣,您可以专门为and定义一些 iteratee-last curried 函数findIndex()

const fromIndex = (cb, index = 0) => (e, i, a) => (
  i >= index && cb(e, i, a)
);
const wrap = (impl, apply) => (...args) => (
  f => iteratee => impl(iteratee, f)
)(
  apply(...args)
);

const find = wrap((array, fn) => array.find(fn), fromIndex);
const findIndex = wrap((array, fn) => array.findIndex(fn), fromIndex);

const array = [3, 7, 5, 1, 9];
const f = element => element > 4;

console.log(`value ${find(f)(array)} index ${findIndex(f)(array)}`);
console.log(`value ${find(f, 3)(array)} index ${findIndex(f, 3)(array)}`);

如果 / 当F# 风格的管道运算符符合规范时,这将使这些部分函数看起来非常吸引人:

// find() and findIndex() defined as above
const array = [3, 7, 5, 1, 9];
const f = element => element > 4;

// value 7 index 1
console.log(`value ${array |> find(f)} index ${array |> findIndex(f)}`);
// value 9 index 4
console.log(`value ${array |> find(f, 3)} index ${array |> findIndex(f, 3)}`);

推荐阅读