简体   繁体   English

使用动态条件过滤以排除javascript中的某些值

[英]Filtering with dynamic criteria to exclude some values in javascript

I have a data array of strings: 我有一个字符串数据数组:

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"

…and another array of criteria, which is dynamically created with formatDate : …以及另一组条件,这些条件是使用formatDate动态创建的:

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

I would like to splice items where the name includes the criteria. 我想拼接名称中包含条件的项目。 The goal is to delete database names depending on seniority days. 目标是根据资历天数删除数据库名称。 So if seniority is 2, it should only keep items with date is today-2days and older. 因此,如果资历为2,则应仅保留日期为今天至2天或更旧的项目。

Here's my program: 这是我的程序:

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

I'm getting firstly an array of criteria with formatDate() which sends me an object {year:2018,month:"11",day:"06"} , for example if i==1 ( today date -i). 我首先使用formatDate()获取一组条件,该条件向我发送了一个对象{year:2018,month:"11",day:"06"} ,例如,如果i==1 (今天date -i)。

Then I'm filtering on the data array. 然后我在数据数组上进行过滤。 Inside it, I loop the array criteria and with an intermediate variable, I decide wether I return the element or not. 在其中,我循环数组条件,并使用一个中间变量确定是否返回该元素。

Then I send the new filtered array. 然后,我发送新的过滤数组。

My problem is that actually I get the same array in entry that at the end. 我的问题是,实际上我在入口处得到的数组与结尾处的数组相同。

What I expect to get is: 我期望得到的是:

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"

 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) 

you could try to make a set of cretaria elements and then filter your data array 您可以尝试制作一组​​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));

If I understand correctly, you want to exclude items from an array of strings based on if the element contains one of the strings from some criteria array. 如果我理解正确,则要根据元素是否包含某个条件数组中的字符串之一,从字符串数组中排除项目。

I would suggest using the following functions: filter() and findIndex() 我建议使用以下函数: filter()findIndex()

findIndex can be used to determine if any of the criteria match a given element from your data array. findIndex可用于确定是否有任何条件与数据数组中的给定元素匹配。

filter allows you to test each element of the data array and only keeps the ones you want. 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) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM