Kyl*_*and 9 arrays filtering vue.js
我正在尝试使用 vue.js 中的计算属性过滤数组。我想搜索多个字段、名称、状态、标签等。
我的数据:
events: [
{
id: 1,
name: 'Name of event',
url: '#',
datetime: '2017-05-10T00:00:00Z',
description: 'The full text of the event',
state: 'VIC',
tags: [
'ordinary',
'advanced'
]
},
{
id: 2,
name: 'Another event',
url: '#',
datetime: '2017-05-12T00:00:00Z',
description: 'The full text of the event',
state: 'VIC',
tags: [
'beginner'
]
},
{
id: 3,
name: 'Great event',
url: '#',
datetime: '2017-05-18T00:00:00Z',
description: 'The full text of the event',
state: 'NSW',
tags: [
'beginner'
]
}
]
Run Code Online (Sandbox Code Playgroud)
},
以下功能按预期工作,但是我无法弄清楚如何让它搜索“标签”中的项目(已注释掉)。
searchevents: function(){
let result = this.events
if (this.filterValue){
result = result.filter(event =>
event.name.toLowerCase().includes(this.filterValue.toLowerCase()) ||
event.state.toLowerCase().includes(this.filterValue.toLowerCase())
// event.tags.toLowerCase().values().includes(this.filterValue.toLowerCase())
)
}
return result
}
Run Code Online (Sandbox Code Playgroud)
以下返回一个空白数组,当我在 angular 但不是在 vue 中完成时,此方法可以正常工作。
searchevents2: function(){
var searchRegex = new RegExp(this.filterValue,'i')
this.events.filter(function(event){
return !self.filterValue || searchRegex.test(event.name) || searchRegex.test(event.state)
})
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够列出要过滤的数组项,或者仅按整个数组过滤。
感谢任何帮助,首先在这里发帖,所以要温柔。我在 Python 方面的经验比 Javascript 多得多,所以有时我也可能会使用不正确的术语。
你离得并不遥远。
对于您的searchEvents过滤器,您只需添加标签过滤器。您可以这样做。
searchevents: function(){
let result = this.events
if (!this.filterValue)
return result
const filterValue = this.filterValue.toLowerCase()
const filter = event =>
event.name.toLowerCase().includes(filterValue) ||
event.state.toLowerCase().includes(filterValue) ||
event.tags.some(tag => tag.toLowerCase().includes(filterValue))
return result.filter(filter)
}
Run Code Online (Sandbox Code Playgroud)
Array.some()是一个标准数组方法,如果数组的任何元素通过测试,则返回 true。
searchevents2: function(){
const searchRegex = new RegExp(this.filterValue,'i')
return this.events.filter(event =>
!this.filterValue || searchRegex.test(event.name) || searchRegex.test(event.state))
}
Run Code Online (Sandbox Code Playgroud)
你searchEvents2真的只留下了一个错误self在那里。self您需要在执行过滤器之前进行设置,或者像我在这里所做的那样,将其转换为箭头函数。
例子。
小智 5
const app = new Vue ({
el: '#app',
data: {
search: '',
userList: [
{
id: 1,
name: "Prem"
},
{
id: 1,
name: "Chandu"
},
{
id: 1,
name: "Shravya"
}
]
},
computed: {
filteredAndSorted(){
// function to compare names
function compare(a, b) {
if (a.name < b.name) return -1;
if (a.name > b.name) return 1;
return 0;
}
return this.userList.filter(user => {
return user.name.toLowerCase().includes(this.search.toLowerCase())
}).sort(compare)
}
}
})Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script>
<div id="app">
<div class="search-wrapper">
<input type="text" v-model="search" placeholder="Search title.."/>
<label>Search Users:</label>
</div>
<ul>
<li v-for="user in filteredAndSorted">{{user.name}}</li>
</ul>
</div>Run Code Online (Sandbox Code Playgroud)