gpt4 book ai didi

javascript - 减少一组谓词函数

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:52 25 4
gpt4 key购买 nike

我有一组谓词进入一个我们将调用 searchForAcceptableNumber 的函数。

searchForAcceptableNumber(arrayOfNumbers: number[], ...isNumberAcceptablePredicates: Array<(aNumber: number) => boolean>): number[] {
const acceptableNumbers: number[] = [];

const isNumberAcceptablePredicate: (aNumber: number) => boolean = (aNumber: number) => {
const isLabelAcceptableReducer = (accumulator, currentValue) => accumulator && currentValue(aNumber);
return isNumberAcceptablePredicates.reduce(isLabelAcceptableReducer);
};

arrayOfNumbers.forEach((aNumber: number) => {
if (isNumberAcceptablePredicate(aNumber)) {
acceptableNumbers.push(aNumber);
}
});
return acceptableNumbers;
}

你明白了。从本质上讲,它遍历,一切都很好......除了 isNumberAcceptablePredicate 不断收到错误类型 (aNumber: number) => (aNumber: number) => boolean 。我可以摆脱类型,它会全部编译并工作得很好。奇怪的是,如果我在调试 session 期间将鼠标悬停在 isNumberAcceptablePredicate 上,它会说它确实是 (aNumber: number) => boolean 类型。

这不一定是代码破坏,也就是说,我最终将这个谓词传递给需要类型 (aNumber: number) => boolean 的其他函数,所以它确实引入了代码-打破了这种额外的限制。我确定我错过了一些荒谬的东西,我只是不知道是什么。

最佳答案

您只需要为 reduce 函数提供一个初始值,否则它默认使用数组中的第一个元素作为初始值,类型为 (aNumber: number) => boolean。而不是 boolean

function searchForAcceptableNumber(
arrayOfNumbers: number[],
...isNumberAcceptablePredicates: Array<(aNumber: number) => boolean>
): number[] {
const acceptableNumbers: number[] = []

const isNumberAcceptablePredicate: (aNumber: number) => boolean = (
aNumber: number,
) => {
const isLabelAcceptableReducer = (accumulator, currentValue) =>
accumulator && currentValue(aNumber)
return isNumberAcceptablePredicates.reduce(isLabelAcceptableReducer, true) // <-- initialise to true
}

arrayOfNumbers.forEach((aNumber: number) => {
if (isNumberAcceptablePredicate(aNumber)) {
acceptableNumbers.push(aNumber)
}
})
return acceptableNumbers
}

你也可以像这样使用一些内置的数组函数来大大缩短这个函数

function searchForAcceptableNumber(
arrayOfNumbers: number[],
...isNumberAcceptablePredicates: Array<(aNumber: number) => boolean>
): number[] {
return arrayOfNumbers.filter(number =>
isNumberAcceptablePredicates.every(predicate => predicate(number)),
)
}

如果您想概括实现,您可以执行以下操作

function filterList<T>(
values: T[],
predicates: Array<(val: T) => boolean>,
): T[] {
return values.filter(val => predicates.every(pred => pred(val)))
}

你也可以使用箭头函数,因为函数只返回一个值,有些人更喜欢它的简洁性

const filterList = <T extends any>(
values: T[],
predicates: Array<(val: T) => boolean>,
): T[] => values.filter(val => predicates.every(pred => pred(val)))

注意:<T extends any>的原因即使 extends any在语义上是多余的,这是必要的,因为 <T> alone 在句法上有歧义,可能被视为 JSX标签

关于javascript - 减少一组谓词函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52750071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com