【发布时间】:2017-02-24 06:52:33
【问题描述】:
是的,又是我。我正在尝试根据字符串数组过滤数组。因此,虽然使用 Vue 可以轻松实现单个字符串过滤器...
<div v-for="item in items | filterBy 'words' in 'property'">
...多个搜索字符串变得更加复杂。已经有几个关于如何在 StackOverflow 上执行此操作的问题,但答案很少。目前,我正在尝试根据我的需要重新调整找到 here 的自定义过滤器,但它不起作用。
我的用例: 我有一组组(复选框),用户可以选择这些组来过滤一组人。每个人都被分配到一个或多个组,因此如果任何用户选择了他们的组中的一个,则该人应该出现。
所以我的模板看起来像这样:
<template v-for="group in ensemble_groups">
<input name="select_group[]" id="group_@{{ $index }}"
:value="group"
v-model="selected_groups"
type="checkbox">
<label for="group_@{{ $index }}">@{{ group }}</label>
</template>
<template v-for="person in cast | filterBy selectGroups">
<div>@{{ person.actor_name }}</div>
</template>
你看到我的自定义过滤器selectGroups了吗?这是我的 Vue 数组:
selected_groups: [],
ensemble_groups: ["Leads","Understudies","Children","Ensemble"],
cast: [
{
actor_name: "Dave",
groups: ["Leads"],
},
{
actor_name: "Jill",
groups: ["Leads"],
},
{
actor_name: "Sam",
groups: ["Children","Ensemble"],
},
{
actor_name: "Austin",
groups: ["Understudies","Ensemble"],
},
],
最后是自定义过滤器。我不知道它是否被触发,因为当我点击一个组复选框时,什么都没有发生。
filters: {
selectGroups: function() {
if (!selected_groups || selected_groups.length === 0) {
return cast;
}
return this.recursiveFilter(cast, selected_groups, 0);
}
},
methods: {
recursiveFilter: function(cast, selected_groups, currentPosition) {
if (currentPosition+1 > selected_groups.length)
return cast;
var new_cast;
new_cast = cast.filter(function(person) {
for (group of person.groups) {
if (group.value == selected_groups[currentPosition])
return true;
}
});
return this.recursiveFilter(new_cast, selected_groups, currentPosition+1);
}
}
因此,如果用户选择Leads,则只会出现 Dave 和 Jill。如果用户随后选中Children,则应该出现 Dave、Jill 和 Sam。我很近!
【问题讨论】:
-
我想要的是一个 filterBy 修饰符,它可以做类似
<template v-for="person in cast | filterBy any(selected_groups) in 'groups'"
标签: javascript arrays vue.js