【发布时间】: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