我有一个包含子列表的列表(参见下面的 JSON 示例),其中可以在 UI 中搜索子列表中的值。
当控制台记录时,它找到匹配项,但返回的数据未被过滤(又名:包括所有数据)
一定是我对filter函数的了解有点有限,理解错了。有人可以在这里纠正我吗?
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;
最佳答案
嵌套的过滤表达式(返回entity.value.toLowerCase()
的那个)等返回所有通过boolean测试的值,这是javascript中过滤表达式的正确使用方法.所以本质上,您将一个 bool 测试传递给过滤器,然后过滤器返回所有通过该测试的项目。但是,在您的外部过滤器功能中,这不是您在做什么。嵌套过滤器返回后,您的外部过滤器函数应将另一个返回 true 或 false 的 bool 表达式作为参数。但是,正如 Zerkms 和 Zze 已经指出的那样,在您的情况下,您为它提供了一个项目数组,或者在这里,提供了一个仅包含单个项目的数组 - 通过前一个 bool 表达式的项目。您需要将外部过滤器中的表达式转换为 bool 表达式,因此可以这样做:
let filtered = nluDataUnfiltered.filter(intent => {
return intent.entities.includes(...intent.entities.filter(entity => {
return entity.value.toLowerCase().indexOf(searchstring.toLowerCase()) > -1
}))
})
这样,includes() 方法将检查实体数组是否包含所搜索的实体,并最终返回所有通过此测试的意图对象。我使用 javascript ...
展开运算符将返回的数组转换为单个项目,否则您会将数组传递给 include 方法,而不是此处预期的单个项目。
关于Javascript filter() 返回所有数据。不过滤匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49743779/