В этой статье мы узнаем, как реализовать сортировку и поиск в массивах с помощью Vue js.

Что мы используем для этого проекта?
1. Vue 3
2. Composition API
3. Поддельный JSON ( jsonplaceholder )
4. Fetch

Vue 3 представляет функцию настройки. Два способа реализации функции настройки.

#one way
<script setup>
  // code
</script>
#another way
<script>
export default {
 setup() {
   // code
 }
}
</script>

Вы хотите узнать больше о настройкеознакомьтесь с официальной документацией
Сначала мы извлекаем всех пользователей из jsonplaceholder.

<script setup>
  import { ref } from 'vue'
  const users = ref([])
   // get users
  function getUsers() {
    fetch('https://jsonplaceholder.typicode.com/users', { method: 'GET'})
    .then(res => res.json())
    .then(data => users.value = data);
  }
  getUsers();
</script>

Мы получаем всех пользователей из API и храним наши данные о пользователях. Теперь мы отображаем всех пользователей

Визуализация пользователя

<table class="styled-table">
  <thead>
    <tr>
      <th>SL</th>
      <th>Name</th>
      <th>Username</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="(user, ind) in users">
      <td>{{ ind+1 }}</td>
      <td>{{ user.name }}</td>
      <td>{{ user.username }}</td>
      <td>{{ user.email }}</td>
    </tr>
  </tbody>
</table>

Дизайн таблицы

<style>
  input[type=text] {
    width: 100%;
    padding: 12px 20px;
    margin: 8px 0;
    display: inline-block;
    border: 1px solid #ccc;
    border-radius: 4px;
    box-sizing: border-box;
  }
  .styled-table {
    border-collapse: collapse;
    margin: 25px 0;
    font-size: 0.9em;
    font-family: sans-serif;
    min-width: 400px;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
  }
  .styled-table thead tr {
    background-color: #009879;
    color: #ffffff;
    text-align: left;
  }
  .styled-table th,.styled-table td {
    padding: 12px 15px;
  }
  .styled-table tbody tr {
    border-bottom: 1px solid #dddddd;
  }
  .styled-table tbody tr:nth-of-type(even) {
    background-color: #f3f3f3;
  }
  .styled-table tbody tr:last-of-type {
    border-bottom: 2px solid #009879;
  }
  .styled-table tbody tr.active-row {
    font-weight: bold;
    color: #009879;
  }
</style>

Теперь выгляди так

Пришло время заняться поиском

<input type="text" v-model="search" placeholder="Search name" />

мы используем Computed Property. убедитесь, что вы импортируете вычисленные

<script setup>
  import { ref, computed } from 'vue'
  const users = ref([])
  const search = ref('')
  
  // filter users
  const userFilterAndSearchAndSort = computed(() => {
    return users.value.filter((user) => {
      let name = user.name.toLowerCase()
      let searchValue = search.value.toLowerCase()
      return name.includes(searchValue)
    })
  })
  
  // get users
  function getUsers() {
    fetch('https://jsonplaceholder.typicode.com/users', { method: 'GET'})
    .then(res => res.json())
    .then(data => users.value = data);
  }
getUsers();
</script>

Здесь вы можете видеть, что мы сохраняем поиск или пользовательский запрос в переменной поиска.
Здесь вы можете видеть метод userFilterAndSearchAndSort, в первую очередь мы фильтруем всех пользователей и проверяем, что это слово включает в себя это user, если есть, то верните user.

Обязательно проверьте эту строку в таблице

<tr v-for="(user, ind) in users">
to
<tr v-for="(user, ind) in userFilterAndSearchAndSort">

Теперь ваш результат выглядит так. Наша функция поиска работает.

Сейчас мы работаем над сортировкой
Мы реализуем здесь систему ASC и DSC Like asc a-z A-Z и 0–9
desc z-a Z-a и 9–0. мы не реализуем обратную систему, например, первый элемент показывает последнюю позицию, а последний элемент показывает первую позицию.
Теперь реализуется время.

Нам нужно изменить наш userFilterAndSearchAndSort

  const search = ref('')
  const currentSortDir = ref('asc')
  const currentSort = ref('name')
  // filter users
  const userFilterAndSearchAndSort = computed(() => {
    let filterUserList = users.value;
    
    // search
    filterUserList = users.value.filter((user) => {
      let name = user.name.toLowerCase()
      let searchValue = search.value.toLowerCase()
      return name.includes(searchValue)
    });
// sort
    return filterUserList.sort((a,b) => {
      let currentSortDirValue = currentSortDir.value
      let currentSortValue = currentSort.value
      
      let modifier = 1;
      if(currentSortDirValue === 'desc') modifier = -1;
      if(a[currentSortValue] < b[currentSortValue]) return -1 * modifier;
      if(a[currentSortValue] > b[currentSortValue]) return 1 * modifier;
      return 0;
    })
  })

добавлен новый метод

function sortBy(param) {
  if(param === currentSort.value) {
     currentSortDir.value = currentSortDir.value==='asc'?'desc':'asc';
  }
  currentSort.value = param;
}

И обновить таблицу и CSS

<th>
  <a href="#" @click="sortBy('name')" :class="[currentSort == 'name' ? 'active' : '']">
    Name
  </a>
</th>
<th>
  <a href="#" @click="sortBy('username')" :class="[currentSort == 'username' ? 'active' : '']">
    Username
  </a>
</th>
## css
a {
  text-decoration: none;
  color: white;
}
.active {
  color: black;
}

Оформление заказаИсходный код&демонстрация

Наслаждайтесь кодами.