Typescript数组映射与筛选器

Typescript array map vs filter vs?

本文关键字:筛选 映射 数组 Typescript      更新时间:2023-09-26

这里有一个typescript方法,它希望遍历一个字符串数组,并返回另一个字符串阵列,其中,与regexp匹配的字符串(格式类似于"[la-la]")将变成"la-la",不匹配的字符串将被删除。因此,如果我的输入数组是:

"[x]", "x", "[y]"

它变成

"x", "y"

这是我的代码:

questions(): string[] {
    var regexp = /'[(.*)']/;
    return this.rawRecords[0].map((value) => {
        console.log(value);
        var match = regexp.exec(value);
        if (match) {
            return match[1];
        }
    });
}

我的输出是这样的:

"x", undefined, "y"

因为"if(match)"。编写此代码的正确typescript/javascript方式是什么?

filter他们出局:

return this.rawRecords[0].map((value) => {
        console.log(value);
        var match = regexp.exec(value);
        if (match) {
            return match[1];
        }
    });
}).filter(x=>!!x);

map的作用是将函数应用于列表中的每个元素。当正则表达式不匹配时,函数不会返回任何值。因此,在这种情况下,JS可能会使其返回undefined。如果你想删除那些与regexp不匹配的,你应该立即使用filter。

想想函数的名称,你会立刻有更好的理解(将函数映射到列表,并过滤列表)。

我真的相信,有时,我们会尝试比我们应该做的更多的功能
这是怎么回事:

var regexp = /'[(.*)']/;
var records = this.rawRecords[0];
var res = [];
for (var i = 0, len = records.length; i < len; ++i) {
    var match = regexp.exec(records[i]);
    if (match) {
        res.push(match[1]);
    }
});
return res;

它不是一行代码,即使我对TypeScript一无所知(你在问题中也问过JavaScript),它也应该比任何函数方法都更高效。

另一个选项是使用reduce()方法,如下所示:

return this.rawRecords[0].reduce((acc, value) => {
    console.log(value);
    var match = regexp.exec(value);
    if (match) {
        acc.push(match[1]);
    }
    return acc;
}, []);

请在JSFIDDLE中检查javascript中等效代码的结果。

我尝试了这个问题,并在下面分享了我的结果。希望这能有所帮助。如果我失败或误解了,请道歉,因为我是打字的新手。

var arr = ["[xy]","x","y"];
var ele =[];
var i;
var op;
var regex = /'[(.*)']/;
var op1 = arr.filter((element)=>
{
    op =regex.exec(element);
    if(op)
    ele.push(op);
    else{
        ele.push(element);
        console.log(op);
    }
    });
    for(i =0;i<ele.length;i++)
    {
        console.log(ele[i]);
    }