具有数组的typescript过滤器数组

时间:2018-04-10 12:41:00

标签: arrays typescript

在这里打破我的头...... 我想用另一个数组过滤一个数组。

用例,我有一个数组,可以使用动态复选框过滤该数组。

到目前为止,我已经提出了以下代码:

var filteredList = this.arrayList.filter(function(e){
           return activeCheckbuttons.filter(function(e2){
               return e2.Description != e.Description
           }).length == 0;
})

上述代码仅在单击一个复选框时有效,但是当点击两个复选框时,它不会。

任何人

谢谢,

1 个答案:

答案 0 :(得分:2)

我认为,对于arrayList中的每个项目,您需要检查activeCheckbuttons中是否有相同描述的项目。如果有,我们将该项添加到结果中,但是,如果没有,我们会忽略它们:

const filteredList = this.arrayList.filter(item1 => 
     !!activeCheckbuttons.find(item2 => item1.Description === item2.Description)
);

现在,这段代码如何运作:

  • 使用filter,我们检查数组中的每个元素。如果该项的谓词返回true,则返回elment。不是,它被跳过了。
  • 在谓词中,我们使用find方法来确定我们检查的项目是否存在于activeCheckbuttons数组中(比较它们的描述)。 find返回匹配条件的第一个元素,因此,如果找到一个,则该项的谓词为true。如果找不到,则返回nullfalse,该项目不会出现在已过滤的数组中。

您会看到我也在使用!!运算符。此运算符只是应用logical not运算符两次。为什么?就像将对象强制转换为值true并将null强制转换为false一样:

  • !!{} - > !(!{}) - > !(false) - > true
  • !!null - > !(!null) - > !(true) - > false

这不是真的必需,但我喜欢这样做,以便在代码中明确我要返回truefalse而不是对象或null。

正如我的评论中所述,您的代码中的问题是您正在过滤第二个数组,删除与您正在检查的项目描述不同的所有元素。当然,如果你有多个,我认为它们不同,所以filter函数至少返回一个元素,主filter返回false和你的结果数组是空的。

如果这不是您需要过滤的具体方式,请告诉我,我会相应地修改代码