Пользовательский фильтр для таблицы из двух разных вызовов

Моя текущая ситуация заключается в том, что я делаю 2 вызова через Axios и получаю два разных файла. Первый вызов - это полный файл json, который создает таблицу, а второй - только категории (почему? Сложное приложение сложное. Оно медленно обновляется из старой структуры). Я создаю два раскрывающихся списка — первый заполняется годами, который также строит таблицу. Второй раскрывающийся список заполнен категориями. При загрузке приложения таблица загружается за текущий год.

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

Мой текущий код:

data() {
 return {
  year:[],
  category:[] ,
  tableData:[],
 }
},

computed: {
 axiosParams(){
  const params = new URLSearchParams();
  params.append('year', this.year);
  return params;
 },

methods: {
 getYears: function(){  
  axios.get('myUrl', {
    params: this.axiosParams
     }).then((response) => {
    this.year = response.data;
    console.info(response.data)   
    this.tableData = response.data.result;
   })
   .catch((err) => {
    console.info(err);
  });
 },

 getCategory: function(){
   let category = [];
   axios.get('mySecondUrl').then((response, i) => {
    this.category = response.data
    for (var i = 0; i < category.length; i++) {
     let catType = i
     this.catType = response.data[i].name;
     console.info(catType);
    }
  })
  .catch((err) => {
    console.info(err);
  })
 }
}
created: {
 this.getYears();
 this.getCategory();
}

Мой HTML:

<select v-model = "selectedYear" @change = "yearSelected">
 <option v-for = "year in years" :key = "year"> {{year}} </option>
</select>

<select v-model = "selectedCat" >
 <option v-for = "(item, index) in category" :item = "item" 
 :key = "index" :value = "item.name"> {{ item.name }} </option>
</select>

Можете ли вы включить образец структуры tableData. В частности, как в нем размещено название категории.

Andrew1325 30.05.2019 09:14

Таким образом, раскрывающийся список моей категории вызывается из другого URL-адреса получения, который также имеет идентификаторы, и я должен получить их оттуда. Итак, снова, когда я выбираю «имя» из раскрывающегося списка, он фильтрует только строки «имени», которые имеют другие значения, такие как someVal, otherVal и т. д. Если «имя» не существует для выбранного года, ничего не показывать. Структура tableData выглядит так и включает в себя также категории: {"status":100, "result":[{ "category":"Name", "year":2019, "username":"test", "otherValues": [ { "someVal":30, "otherVal":20 },] } ]}

mx1517 30.05.2019 09:41
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, ваш tableData представляет собой массив таких объектов:

[
  { 
    "category":"Name", 
    "year":2019, 
    "username":"test", 
    "otherValues":[ 
      { 
        "someVal":30, 
        "otherVal":20 
      },
    ] 
  },
]

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

В основном вам нужен новый массив, который будет отображать выбранные данные, или, если ничего не выбрано, показать весь массив tableData. Это должно быть вычисляемое свойство.

computed: {
  filteredTableData() {
    if (this.selectedCat !== null) {
      const filtered = this.tableData.filter(d => d.category === this.selectedCat)
      return filtered
    }
    return this.tableData
  },
}

Это предполагает, что когда вы инициализируете selectedCat в данных, вы устанавливаете его равным нулю. Поэтому, когда кто-то выбирает категорию, она будет соответствовать условию «если», и наша константа «filtered» будет новым массивом всех элементов «tableData», которые удовлетворяют нашему условию. Если ничего не выбрано, возвращается весь массив tableData.

Когда вы обращаетесь к «tableData» в своем шаблоне, предположительно с помощью v-for = "data in tableData", вам теперь придется использовать v-for = "data in filteredTableData".

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