使用forEach过滤数组

时间:2019-03-07 10:13:24

标签: javascript jquery arrays filter

我有一系列日期,我想在其中过滤掉特定的日子。 那是我以前的解决方案,效果很好:

var available = dates.filter(function(e) {
  return (
    e.getDay() != 0 && // sunday
    e.getDay() != 6 && // saturday
    e.getDay() != 2 && // tuesday
    e.getDay() != 3 && // wednesday
  );
});

现在,我想使它动态化。所以我得到了一个像这样的数组:

var unavailable = [0, 2, 3, 6]

然后我尝试像这样过滤掉那些日子:

unavailable.forEach(function(x){
  available = dates.filter(function(e, index){
    return e.getDay() != x;
  });
});

这似乎不起作用。我做错了什么,如何使它起作用?预先感谢。

5 个答案:

答案 0 :(得分:4)

无需使用forEachfilterincludes

var unavailable = [0, 2, 3, 6]
var dates = ['1-1-2019', '1-2-2019', '1-3-2019', '1-4-2019',' 1-5-2019', '1-6-2019', '1-7-2019', '1-8-2019',' 1-9-2019'];
workingDays = dates.filter(e => {
return !unavailable.includes(new Date(e).getDate())})
console.log(workingDays)

答案 1 :(得分:1)

您需要切换比较顺序并返回检查结果。在这种情况下,您需要Array#every而不是Array#forEach,因为您需要过滤结果。

available = dates.filter(function(e, index) {
    return unavailable.every(function(x) {
        return e.getDay() != x;
    });
});

Array#some相同,返回结果的取反和比较的取反。

available = dates.filter(function(e, index) {
    return !unavailable.some(function(x) {
        return e.getDay() === x;
    });
});

一种较短的方法。

var unavailable = [0, 2, 3, 6]
    available = dates.filter(e => !unavailable.includes(e.getDay()));

答案 2 :(得分:0)

我为您找到了正确的答案。

let unavailable = [0, 2, 3, 6];
available = dates.filter(e => !unavailable.includes(e.getDay());

您的代码存在的问题是,对于不可用数组中的每个元素,您都将重置可用

答案 3 :(得分:0)

您可以尝试以下操作:

available = dates.filter(function(e) {
  return unavailable.indexOf(e.getDay()) === -1 ? true : false;
})

您的代码存在的问题是forEach会重写每次迭代的可用值,并且您的程序会增加理解的难度。

答案 4 :(得分:0)

如果您对创建数组不十分严格,并且不想在代码中的其他任何地方使用它,则无需这样做。

dates.filter(e => e.getDay().toString().match(/0|6|2|3/));