【问题标题】:Filter array using forEach使用 forEach 过滤数组
【发布时间】:2019-03-07 10:13:24
【问题描述】:

我有一个日期数组,我想在其中过滤掉特定的日期。 这是我以前的解决方案,效果很好:

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;
  });
});

这似乎不起作用。我做错了什么,我怎样才能让它发挥作用?提前致谢。

【问题讨论】:

  • 代码中的日期是什么?
  • 你必须反过来做:dates.filter(function() { /* check if .getDay() is part of the array stored in unavailable */ })
  • 什么是dates数组
  • @the_ultimate_developer 我的问题中没有包含日期​​数组,因为它只是像[new Date("2019-03-07"), new Date("2019-03-09"), ...] 这样生成的数组,然后转到[Mon Apr 01 2019 02:00:00 GMT+0200, Tue Apr 02 2019 02:00:00 GMT+0200, ...]

标签: javascript jquery arrays filter


【解决方案1】:

无需使用forEach 使用filterincludes

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)

【讨论】:

  • 感谢您的回答!我接受了Ninas的回答,因为它更详细。 +1 寿 :)
【解决方案2】:

您需要交换比较的顺序并返回检查结果。在这种情况下,您需要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()));

【讨论】:

    【解决方案3】:

    如果您不拘泥于创建数组并且不会在代码中的其他任何地方使用,那么就没有必要。

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

    【讨论】:

      【解决方案4】:

      您可以尝试以下方法:

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

      您的代码的问题在于forEach 每次迭代都会重写available 的值,并且您的程序增加了理解难度。

      【讨论】:

        【解决方案5】:

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

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

        您的代码的问题在于,对于 unavailable 数组中的每个元素,您都在重置 available

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 2014-02-13
          • 2023-03-28
          • 2021-09-30
          • 2021-07-15
          • 1970-01-01
          • 2021-05-07
          相关资源
          最近更新 更多