【问题标题】:filter data from nested array in vue.js从 vue.js 中的嵌套数组中过滤数据
【发布时间】:2020-01-21 07:05:37
【问题描述】:

我正在使用 Vue.js 进行模板开发。我有一个像 faq 这样的部分,我想在上面添加搜索栏,但问题是我的数据数组是嵌套数据,所以它返回所有数据而不过滤。

Dom

<v-container>
         <v-card>
            <div>
               <v-text-field label="Search" v-model="searchValue"></v-text-field>
            </div>
         </v-card>
      </v-container>
      <div v-for="items of filterfaq" :key="items.category"> 
         <h2>{{ items.category }}</h2>
         <v-expansion-panels>
            <v-expansion-panel v-for="subitems of items.content" :key="subitems.qus">
               <v-expansion-panel-header>{{ subitems.qus }} {{subitems.views}}</v-expansion-panel-header>
               <v-expansion-panel-content>
                  {{ subitems.ans }}
               </v-expansion-panel-content>
            </v-expansion-panel>
         </v-expansion-panels>
      </div>

脚本

import { faq } from '../../data.js';
   export default {
      data: () => ({
         faq,
         searchValue : ''
      }),
      computed:{
         filterfaq () {
            const search = this.searchValue.toLowerCase().trim();
            if (!search) return this.faq;
            return this.faq.filter(item => {
               return item.content.filter(item => {
                  return item.qus.toLowerCase().indexOf(search) > -1
               });
            });
         }
      }
   }

数据.js

export const faq = [
    {
        id:1,
        category:'General Questions',
        content: [
            {
                subid:1,
                qus: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit?',
                ans: ' Phasellus a est id mi gravida congue.',
                views: '225'
            },
            {
                subid:2,
                qus: 'Duis porta ante ac dui iaculis, nec interdum ligula semper?',
                ans: ' Phasellus a est id mi gravida congue.',
                views: '225'
            }
        ]       
    }
 ]

一个是常见问题数组,另一个嵌套数组是内容,那么我该如何搜索?我尝试使用上面的代码,但它没有提供我想要的。

更新: 现在我需要从下一个数组中过滤数据。

export const faq = [
    {
        id:1,
        category:'General Questions',
        content: [
            {
                subid:1,
                qus: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit?',
                ans: ' Phasellus a est id mi gravida congue.',
                views: '225',
                items:[{
                    subqus: 'Lorem ipsum dolor sit amet?'
                    subans: 'Lorem ipsum dolor sit amet.'
                }]
            },
            {
                subid:2,
                qus: 'Duis porta ante ac dui iaculis, nec interdum ligula semper?',
                ans: ' Phasellus a est id mi gravida congue.',
                views: '225',
                items:[{
                    subqus: 'Lorem ipsum dolor sit amet?'
                    subans: 'Lorem ipsum dolor sit amet.'
                }]
            }
        ]       
    }
 ]

我怎样才能做到这一点?

【问题讨论】:

  • 不是 vue 人,但您确定您的搜索值正在被找到还是真实的,因为如果没有,那么看起来您正在返回所有常见问题解答?
  • @user254694 是的!当我们在搜索栏中输入任何字母时,我确信会找到搜索值。
  • 对代码改进的建议 - 您可以在内部过滤器中返回 item.qus.toLowerCase().indexOf(search) > -1,没有理由将其包装在 if 中。
  • 常见问题中有多少项?如果项目数量较少,例如最多 100 个,您可以在 faq 项目上使用 v-if,例如 v-if="item.qus.toLowerCase().indexOf(search) &gt; -1"

标签: javascript vue.js vuejs2


【解决方案1】:

目前您正在过滤faq,因此对于每个项目,您将获取其所有内容或不获取。

你可以这样做:

function filterfaq () {
  const search = this.searchValue.toLowerCase().trim();
  if (!search) return this.faq;
  return this.faq.map(item => {
    return {
      ...item,
      content: item.content.filter(question => {
        return question.qus.toLowerCase().includes(search);
      }),
    }
  });
}

【讨论】:

  • 感谢您的回复 它正在搜索问题,但是当我们从搜索栏中删除字母时,它不会显示所有内容。
  • @VarinderSohal 确实看起来像以前的方法 vas 覆盖常见问题解答,请参阅编辑,它现在应该可以工作了 :)
  • 嘿,我带了一点变化回来,你可以看到我更新的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2019-07-08
  • 2017-06-15
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多