在这里打破我的头...... 我想用另一个数组过滤一个数组。
用例,我有一个数组,可以使用动态复选框过滤该数组。
到目前为止,我已经提出了以下代码:
var filteredList = this.arrayList.filter(function(e){
return activeCheckbuttons.filter(function(e2){
return e2.Description != e.Description
}).length == 0;
})
上述代码仅在单击一个复选框时有效,但是当点击两个复选框时,它不会。
任何人
谢谢,
答案 0 :(得分:2)
我认为,对于arrayList
中的每个项目,您需要检查activeCheckbuttons
中是否有相同描述的项目。如果有,我们将该项添加到结果中,但是,如果没有,我们会忽略它们:
const filteredList = this.arrayList.filter(item1 =>
!!activeCheckbuttons.find(item2 => item1.Description === item2.Description)
);
现在,这段代码如何运作:
filter
,我们检查数组中的每个元素。如果该项的谓词返回true
,则返回elment。不是,它被跳过了。find
方法来确定我们检查的项目是否存在于activeCheckbuttons
数组中(比较它们的描述)。 find
返回匹配条件的第一个元素,因此,如果找到一个,则该项的谓词为true
。如果找不到,则返回null
,false
,该项目不会出现在已过滤的数组中。您会看到我也在使用!!
运算符。此运算符只是应用logical not
运算符两次。为什么?就像将对象强制转换为值true
并将null
强制转换为false一样:
!!{}
- > !(!{})
- > !(false)
- > true
!!null
- > !(!null)
- > !(true)
- > false
这不是真的必需,但我喜欢这样做,以便在代码中明确我要返回true
或false
而不是对象或null。
正如我的评论中所述,您的代码中的问题是您正在过滤第二个数组,删除与您正在检查的项目描述不同的所有元素。当然,如果你有多个,我认为它们不同,所以filter
函数至少返回一个元素,主filter
返回false
和你的结果数组是空的。
如果这不是您需要过滤的具体方式,请告诉我,我会相应地修改代码