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

时间:2018-11-07 15:06:26

标签: javascript arrays filtering

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

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"

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以尝试制作一组​​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));

答案 2 :(得分:0)

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

我建议使用以下功能:filter()findIndex()

Route::get('login', 'Auth\LoginController@showLoginForm')->name('login'); Route::post('login', 'Auth\LoginController@login'); Route::get('logout', 'Auth\LoginController@logout')->name('logout'); 可用于确定是否有任何条件匹配数据数组中的给定元素。

findIndex允许您测试数据数组的每个元素,仅保留所需的元素。

filter