Javascript filter()返回所有数据。不过滤匹配

时间:2018-04-10 01:09:41

标签: javascript ecmascript-6

我有一个带有子列表的列表(参见下面的示例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;

1 个答案:

答案 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方法而不是像这里那样的单个项目。