Javascript уменьшить, не отображать категорию, если нет элемента для отображения - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть данные, которые поступают из базы данных, которые я фильтрую и группирую элемент на основе поля категории, а затем отображаю элементы с соответствующей категорией, и вот код, который я получил Я использую EJS как шаблонизатор :

<% 

var catDocs =   docs.reduce((acc, x) => {
    acc[x.datas.category] = [...(acc[x.datas.category] || []), x];
    return acc;
}, {});

Object.entries(catDocs).map(function ([cat, items]){ %>
  <h4 class="category"><%=ucfirst(cat)%></h4>
<div class="row">
  <%
    items.filter(function(item) {
      if (!datas.loggedIn && item.datas.status !== 'published') {
return false; // skip
      }
      return true;
    }).map(function (item) {%> 


    <h5><%= item.datas.status %></h5>

    <% }); 

}); %>

А вот исходные данные до reduce:

Original Data

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

Если кто-то может помочь скрыть заголовок, если нет элемента для показа (другими словами, если if there's not any pushblished item and there's is not logged in don't display the corresponding title)

Большое спасибо всем за помощь.

С наилучшими пожеланиями

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Итак, вы хотите отфильтровать только записи с правдоподобным loggedIn свойством или статусом "опубликовано"?Начните с этого.

catDocs =  docs
   .filter(({ datas }) => datas.loggedIn || datas.status === 'published')
   .reduce((acc, x) => { // the rest here

Кстати, это не очень хорошая функция редуктора, изменяющая аккумулятор вместо только , возвращающая новое значение.

0 голосов
/ 07 апреля 2019

Лучше подготовить данные в структуру, где вашему представлению будет проще визуализировать.

Например, сначала сопоставьте и отфильтруйте datas.docs в новый массив, в котором есть только пары category => items, где items.length>0

Также переместите проверку! Datas.loggedIn вне вашего фильтра, так как вы не хотите ничего визуализировать, если пользователь не вошел в систему. Это нормально, если в вашем примере предложение выше всего остального.

...