Как работает фильтр в узле?

У меня есть 6 объектов в массиве, поэтому мне нужно их отфильтровать. Проблема в том, что в фильтре я получаю false для каждого 6 объекта, в этом случае я должен получить пустой массив, но не получаю пустой массив. Не фильтрует, не знаю почему?...


    const result = await Promise.all(
      pricesForEachProductTogether.filter(async (finalResult) => {
        const pkgHaveMultiDay: boolean = await filterFinalResultByTravelMultiDay(
          finalResult,
          multiDay
        )

        if (pkgHaveMultiDay) {
          return true
        }

        return false
      })
    )

    return result

Это мой код фильтра. Итак, в этом случае я получаю 6 false в pkgHaveMultiDay, поэтому результатом должен быть пустой массив. Но я получаю свои объекты... Он не фильтрует. Почему?

filter должен вернуть boolean. Если вы возвращаете обещание, оно считается истинным значением.
vighnesh153 06.02.2023 09:50

Вы не можете использовать асинхронную функцию внутри фильтра напрямую. Оформить заказ этот пост для получения дополнительной информации

Shakya Peiris 06.02.2023 09:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

работает именно так, как описано на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Момент с вашим кодом заключается в том, что filter не поддерживает асинхронные функции, поэтому, когда вы вводите ключевое слово async, вы буквально заставляете свою функцию возвращать обещание (разрешенное с возвращаемым вами значением), которое рассматривается как true (как и любой другой объект)

"Момент с вашим кодом" Я никогда не слышал, чтобы "момент" употреблялся таким образом.

Samathingamajig 06.02.2023 09:55
Ответ принят как подходящий

Имея его как функцию async, вы всегда будете возвращать Promise, потому что так работают асинхронные функции. Синхронный характер Array.prototype.filter означает, что он не будет пытаться ждать обещаний для вас, он просто копирует истинные значения и игнорирует ложные значения. Обещания всегда правдивы, поэтому, даже если это Promise<false>, оно будет действовать как true при преобразовании самого обещания в логическое значение.

Чтобы исправить это, создайте отдельный массив логических значений, чтобы сохранить их, используя от Promise.all до await все внутренние промисы, а затем отфильтруйте с помощью этого логического массива.

const shouldKeepResult = await Promise.all(pricesForEachProductTogether.map(async(finalResult) => {
  const pkgHaveMultiDay = await filterFinalResultByTravelMultiDay(
    finalResult,
    multiDay
  );
  
  return pkgHaveMultiDay;
}));

const result = pricesForEachProductTogether.filter((_, i) => shouldKeepResult[i]);

return result;

Большое спасибо, да, это сработало. Спасибо, что объяснили, почему не работает.

tracker_id_sub91 06.02.2023 09:56

Другие вопросы по теме