#javascript #arrays
#javascript #массивы
Вопрос:
Я пытаюсь отфильтровать свой массив с помощью Array.filter()
функции, однако я столкнулся с этой проблемой. Мне нужно вызвать какую-то другую функцию внутри filter
функции асинхронно. Однако массив не изменяет свое значение в зависимости от условий, которые я определяю в функции.
const filterWithEmail = data.filter(async (doc) =>
{
const findUser = await UserService.findUser(doc.id).catch(err => {});
if (findUser)
{
const { email } = findUser;
return regexFilter ? regexFilter.test(email.normalize("NFKC")) : false;
}
});
По какой-то причине этот код вообще не влияет на data
массив.
Есть предложения, что я делаю не так?
Заранее благодарю вас.
Комментарии:
1.
.filter
ожидает синхронный предикат. Поскольку вы предоставляете асинхронную функцию, она просто принимает возвращенное обещание как истинное значение и предполагает, что все проходит.
Ответ №1:
filter
ожидается, что возвращаемое значение обратного вызова будет логическим, но async
функции всегда возвращают обещание.
Вы не знаете, хотите ли вы вернуться true
или false
вовремя сообщить filter
, что это такое.
Что вы, возможно, хотите сделать, это:
map
данные изdata
в{ keep: true, original_data: data }
(с использованиемasync
обратного вызова)- Передайте результирующий массив обещаний в
Promise.all
await
возвращаемое значениеPromise.all
filter
этот массив с:.filter(data => data.keep)
- Верните исходные объекты с помощью
.map(data => data.original_data)
Что-то в этом роде (непроверенное):
const filterWithEmail = (
await Promise.all(
data.map(async (data) => {
const findUser = await UserService.findUser(doc.id).catch((err) => {});
let keep = false;
if (findUser amp;amp; regexFilter)
keep = regexFilter.test(email.normalize("NFKC"));
return { data, keep };
})
)
)
.filter((data) => data.keep)
.map((data) => data.data);