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

标签 javascript ecmascript-6

我有一个包含子列表的列表(参见下面的 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/

相关文章:

javascript - 在 JavaScript 提交操作期间从 DOM 中删除 HTML 表单

javascript - RxJs:从 ID 标识的其他流更新列表中的值

javascript - 两 Axis 的 Highcharts 图表无法正确缩放

javascript - 链接 .apply() 和 .bind() 令人惊讶的行为

javascript - array.pop()的返回值;

javascript - 如何让div自动滚动到底部

javascript - 如何在 Javascript 中访问 &lt;textarea&gt; 中当前突出显示的文本

javascript - 如何将不可变 js 导入 angular 2 (alpha)?

eclipse - EcmaScript 6 - 用于 Eclipse 验证错误的 Tern IDE

Javascript字符串插值给出与字符串连接不同的结果