【问题标题】:Filtering with dynamic criteria to exclude some values in javascript使用动态条件过滤以排除 javascript 中的某些值
【发布时间】:2018-11-08 18:28:55
【问题描述】:

我有一个字符串数据数组:

0:"dbname_default_2018-10-26"
1:"dbname_default_2018-10-27"
2:"dbname_default_2018-10-28"
3:"dbname_default_2018-10-30"
4:"dbname_default_2018-10-31"
5:"dbname_default_2018-11-01"
6:"dbname_default_2018-11-03"
7:"dbname_default_2018-11-04"
8:"dbname_default_2018-11-06"
9:"dbname_default_2018-11-07"
10:"dbname_default_2018-11-08"

…还有另一个条件数组,它是用formatDate动态创建的:

0:"2018-11-06"
1:"2018-11-07"

我想拼接名称包含条件的项目。目标是根据资历天数删除数据库名称。因此,如果资历为 2,它应该只保留日期为今天 - 2 天或更早的项目。

这是我的程序:

async function selectDdToDelete(dbArray, seniority) {
    let datesToKeep: string[] = [];
    let dbTokeep;
    for (let i = seniority; i >= 0; i--) {
        datesToKeep.push(
            `${formatDate(i).year}-${formatDate(i).month}-${formatDate(i).day}`
        );
    }
    dbTokeep = dbArray.filter(elm => {
        let exists = false;
        for (let i = 0; i < datesToKeep.length; i++) {
            if (elm.includes(datesToKeep[i])) {
                exists = true;
            }
        }
        if (!exists) {
            return elm;
        }
    });

    return dbTokeep;
}

我首先得到一个带有formatDate() 的条件数组,它向我发送一个对象{year:2018,month:"11",day:"06"},例如i==1(今天日期-i)。

然后我对数据数组进行过滤。在其中,我循环数组条件并使用中间变量决定是否返回元素。

然后我发送新的过滤数组。

我的问题是实际上我在条目中得到了与最后相同的数组。

我期望得到的是:

0:"dbname_default_2018-10-26"
1:"dbname_default_2018-10-27"
2:"dbname_default_2018-10-28"
3:"dbname_default_2018-10-30"
4:"dbname_default_2018-10-31"
5:"dbname_default_2018-11-01"
6:"dbname_default_2018-11-03"
7:"dbname_default_2018-11-04"
8:"dbname_default_2018-11-08"

【问题讨论】:

  • formatDate 是如何工作的?你能把它包含在你的代码示例中吗?
  • 只是一个优化,但你可以直接尝试datesToKeep.join('|').includes(...)。它将为您节省再次循环的工作。此外,如果不匹配则返回 elm 没有意义。
  • @Rajesh 不完全是优化。当然它会使代码更简洁,但是你必须从每个条目中提取日期子字符串,includes() 将尝试从每个字符串字符开始匹配,而不是从聚合字符串中的每个日期字符串开始。
  • Array.filter 应该返回一个布尔值,而不是一个数组元素。您可以尝试修复它并查看您的代码是否有效?
  • 就是这样!太感谢了。现在,如果有一种方法可以优化它并使代码更具可读性,那就太酷了

标签: javascript arrays filtering


【解决方案1】:

var data = [
"dbname_default_2018-10-26",
"dbname_default_2018-10-27",
"dbname_default_2018-10-28",
"dbname_default_2018-10-30",
"dbname_default_2018-10-31",
"dbname_default_2018-11-01",
"dbname_default_2018-11-03",
"dbname_default_2018-11-04",
"dbname_default_2018-11-06",
"dbname_default_2018-11-07",
"dbname_default_2018-11-08" ]

const dynamicCretarias = [
  "2018-11-06",
  "2018-11-07"
];

data = data.filter((item)=> !dynamicCretarias.some(t => item.includes(t)))
console.log(data)

【讨论】:

    【解决方案2】:

    如果我理解正确,您希望根据元素是否包含某个条件数组中的字符串之一,从字符串数组中排除项。

    我建议使用以下函数:filter()findIndex()

    findIndex 可用于确定是否有任何条件与数据数组中的给定元素匹配。

    filter 允许您测试数据数组的每个元素并只保留您想要的元素。

    let data = [
      "dbname_default_2018-10-26",
      "dbname_default_2018-10-27",
      "dbname_default_2018-10-28",
      "dbname_default_2018-10-30",
      "dbname_default_2018-10-31",
      "dbname_default_2018-11-01",
      "dbname_default_2018-11-03",
      "dbname_default_2018-11-04",
      "dbname_default_2018-11-06",
      "dbname_default_2018-11-07",
      "dbname_default_2018-11-08"
    ]
    
    let criteria = ["2018-10-26","2018-10-27"]
    
    let results = data.filter( element => criteria.findIndex( crit => element.includes(crit))<0)
    
    console.log(results)

    【讨论】:

      【解决方案3】:

      您可以尝试制作一组​​ cretaria 元素,然后过滤您的数据数组

      const data = [
      "dbname_default_2018-10-26",
      "dbname_default_2018-10-27",
      "dbname_default_2018-10-28",
      "dbname_default_2018-10-30",
      "dbname_default_2018-10-31",
      "dbname_default_2018-11-01",
      "dbname_default_2018-11-03",
      "dbname_default_2018-11-04",
      "dbname_default_2018-11-06",
      "dbname_default_2018-11-07",
      "dbname_default_2018-11-08"
      ];
      
      const dynamicCretarias = [
        "2018-11-06",
        "2018-11-07"
      ];
      
      const dynamicCretariasSet = dynamicCretarias.reduce((set, item) => {
        return set.add(data.find(dataEl => dataEl.includes(item)))
      }, new Set());
      
      const filtered = data.filter(item => !dynamicCretariasSet.has(item));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多