Почему возврат arr.includes () отличается от возврата true в условном операторе, проверяющем тот же массив? - PullRequest
0 голосов
/ 11 июля 2020

Я создаю «поисковую систему», чтобы мой клиент мог получить доступ к некоторым документам на основе их категорий и идентификаторов. Для этого я фильтрую все доступные документы, поэтому я отображаю только те, которые соответствуют текущей странице (это может быть страница новостей, финансовая страница, страница событий и т. Д. c.)

Я столкнулся с ошибка и, к счастью, обнаружил, что была разница, которую я до сих пор не понимаю ...

CASE 1 Дает мне 113 результатов

const allDocuments = [{id: 1, ....}, {id: 2, ....}, {id: 3, ...}, ...]
const currentPageIds = [1, 2, 3]

const filteredDocuments = allDocuments.filter(document => {
          // each document have one or more category ids
          for(const categoryID of document.category_id) {
            return currentPageIds.includes(categoryID)
        }
      })

CASE 2 Дает мне 134 результата

const allDocuments = [{id: 1, ....}, {id: 2, ....}, {id: 3, ...}, ...]
const currentPageIds = [1, 2, 3]

const filteredDocuments = allDocuments.filter(document => {
          // each document have one or more category ids
          for(const categoryID of document.category_id) {
            if(currentPageIds.includes(categoryID)) {
              return true
            }
         }
      })

Насколько я понимаю, функция includes() должна возвращать логическое значение, поэтому в моем примере, чем это отличается от возврата true внутри условное выражение?

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Если мы преобразуем ваш случай 1 в направление вашего дела 2. Это будет следующий код. В вашем случае 2. блок else отсутствует. Это может быть причиной различий в результатах.

for (const categoryID of document.category_id) {
  if (currentPageIds.includes(categoryID)) {
    return true;
  } else {
    return false;
  }
}

В качестве альтернативы вы можете попробовать

const filteredDocuments = allDocuments.filter((doc) =>
  doc?.category_id?.some((id) => currentPageIds.includes(id))
);

Надеюсь, это поможет.

0 голосов
/ 11 июля 2020

Проблема в logi c case 1, вы возвращаете false для случаев, когда вы должны вернуть true, и это объясняет, почему случай 1 находит меньше случаев

См. Комментарии в следующем коде для дополнительных пояснений

const filteredDocuments = allDocuments.filter(document => {
          // each document have one or more category ids
          for(const categoryID of document.category_id) {
            // here sometimes you are returning false, when you should be returning true
            // this happens here for example when the first category 
 // in document.category_id is not included in currentPageIds, while next pages in document.category_id may be included
            return currentPageIds.includes(categoryID)
        }
      })
...