Javascript 如何让异步函数使用Array.Filter作为参数传入元素
目标是检查MongoDB中是否存在重复记录,并返回一个新的文件对象(filteredObj),该对象不包含数据库中已经存在的记录。每个记录都有一个描述码 hasDuplicateDescription方法返回解析为true或false的承诺,如果数据库中没有现有记录,则返回true。否则返回false。但是,返回的filteredObj具有原始fileObj内容,没有进行任何过滤Javascript 如何让异步函数使用Array.Filter作为参数传入元素,javascript,arrays,Javascript,Arrays,目标是检查MongoDB中是否存在重复记录,并返回一个新的文件对象(filteredObj),该对象不包含数据库中已经存在的记录。每个记录都有一个描述码 hasDuplicateDescription方法返回解析为true或false的承诺,如果数据库中没有现有记录,则返回true。否则返回false。但是,返回的filteredObj具有原始fileObj内容,没有进行任何过滤 const filteredObj = fileObj.filter((record) => {
const filteredObj = fileObj.filter((record) => {
return this.hasDuplicateDescription(record.description).then(
(res) => {
return res;
}
);
});
return filteredObj;
下面的解决方案是让异步函数在其他文章中使用array.filter的推荐解决方案,但在我的案例中它不起作用,因为hasDuplicateDescription是一个异步函数,它需要array.filter方法传入的每个数组元素作为其参数
const results = await Promise.all(your_promises)
const filtered_results = results.filter(res => //do your filtering here)
感谢您对如何解决此问题的任何建议
谢谢大家! 您可以将数组中的每个元素映射到解析筛选条件的promise,并根据条件解析的结果将其与值筛选器组合,然后映射到值:
const asyncFilter = async (arr, asyncCheck) => (await Promise.all(arr.map(async (item) => [await asyncCheck(item), item]))).filter(([b]) => b).map(([, x]) => x)
asyncFilter(fileObj, (record) => this.hasDuplicateDescription(record.description))
如果你需要收集所有的过滤结果,你必须等待所有的承诺完成。async只是将函数的返回包装在一个promise中,所以只需收集它们并将其提供给promise.all