我有一个带有子列表的列表(参见下面的示例JSON),其中子列表中的值可以在UI中搜索。
当控制台记录时,它会找到匹配项,但不会过滤返回的数据(也就是说:包括所有数据)
一定是我对滤波器功能的了解有点限制,我理解错了。有人可以在这里纠正我吗?
示例JSON:
{
"id": "fb18eee6-423e-475d-9077-c03dd4ffd80f",
"text": "Hvor lang holdbarhet har kyllingfilet i fryseren?",
"intent": "shelf_life",
"entities": [
{
"start": 25,
"end": 37,
"value": "kyllingfilet",
"entity": "ingredient"
},
{
"start": 40,
"end": 48,
"value": "fryseren",
"entity": "ingredient_placement"
},
{
"start": 10,
"end": 20,
"value": "holdbarhet",
"entity": "shelf_life"
}
],
"isSociety": false
},
{
"id": "1072392a-38dc-43f2-affe-74a4fde81bfd",
"text": "Hvor lang holdbarhet har ribbe i kjøleskapet? ",
"intent": "shelf_life",
"entities": [
{
"start": 33,
"end": 44,
"value": "kjøleskapet",
"entity": "ingredient_placement"
},
{
"start": 10,
"end": 20,
"value": "holdbarhet",
"entity": "shelf_life"
},
{
"start": 25,
"end": 30,
"value": "ribbe",
"entity": "ingredient"
}
],
"isSociety": false
}
以下是过滤器代码:
let searchstring = this.searchtext;
let filtered = this.nluDataUnfiltered.filter(intent => {
return intent.entities.filter(entity => {
return entity.value.toLowerCase().indexOf(searchstring.toLowerCase()) > -1
// if (entity.value.toLowerCase() === searchstring.toLowerCase()){
// console.log("matched : " + entity.value + " <-> " + searchstring)
// PS ! When a match is found, it console logs it out (works!)
// }
})
});
return filtered;
答案 0 :(得分:1)
嵌套过滤器表达式(返回entity.value.toLowerCase()
的那个)等返回所有通过布尔测试的值,这是在javascript中使用过滤器表达式的正确方法。基本上,您将布尔测试传递给过滤器,过滤器返回通过此测试的所有项目。然而,在你的外部过滤功能中,这不是你正在做的事情。嵌套过滤器返回后,外部过滤器函数应该将另一个返回true或false的布尔表达式作为参数。但是,正如Zerkms和Zze已经指出的那样,在你的情况下,你为它提供了一个项目数组,或者这里,只有一个包含单个项目的数组 - 传递前一个布尔表达式的项目。您需要将外部过滤器中的表达式转换为布尔表达式,因此可以执行以下操作:
let filtered = nluDataUnfiltered.filter(intent => {
return intent.entities.includes(...intent.entities.filter(entity => {
return entity.value.toLowerCase().indexOf(searchstring.toLowerCase()) > -1
}))
})
这样,includes()方法将检查实体数组是否包含被搜索的实体,并最终返回通过此测试的所有intent对象。我使用javascript ...
扩展运算符将返回的数组转换为单个项目,否则你将把数组传递给include方法而不是像这里那样的单个项目。