【发布时间】:2020-07-17 22:37:11
【问题描述】:
我正在 Vue 中构建一个词汇表,并添加一个计算过滤器。它正在过滤结果,但它会返回数组中的所有对象,即使它们不匹配。似乎只需要找到一个匹配的对象,然后返回所有内容。在下面的 JSON 示例中,有两个条目:B 和 H,每个条目中都有对象:BBB、XXX、HHH 和 XXX。如果我输入 BBB,我会同时返回 BBB 和 XXX,但我不希望看到 XXX。
我的 JSON 数据结构如下所示:
[
{
"title": "b",
"link": "b",
"items": [
{
"title": "BBB",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur libero ipsum, euismod posuere posuere ac, rhoncus eget nisi. Praesent ac lorem ut est fringilla porta.</p>",
"active": false
},
{
"title": "XXX",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur libero ipsum, euismod posuere posuere ac, rhoncus eget nisi. Praesent ac lorem ut est fringilla porta.</p>",
"active": false
}
]
},
{
"title": "h",
"link": "h",
"items": [
{
"title": "HHH",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur libero ipsum, euismod posuere posuere ac, rhoncus eget nisi. Praesent ac lorem ut est fringilla porta.</p>",
"active": false
},
{
"title": "XXX",
"content": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur libero ipsum, euismod posuere posuere ac, rhoncus eget nisi. Praesent ac lorem ut est fringilla porta.</p>",
"active": false
}
]
}
]
计算过滤代码:
filteredPosts() {
let compItems = this.compItems;
if (this.filterTitle) {
compItems = compItems.filter(item => {
return item.items.some(subItem => {
return (
subItem.title
.toLowerCase()
.indexOf(this.filterTitle.toLowerCase()) !== -1
);
});
});
}
return compItems;
}
我的标记的简化版本:
<input
placeholder="Filter by Name"
v-model="filterTitle"
/>
<div v-for="(item, index) in filteredPosts" :key="index">
{{ item.title }}
<ul v-for="(subItem, index) in item.items" :key="index">
<li>{{ subItem.title }}</li>
</ul>
<hr />
</div>
【问题讨论】: