Javascript Typescript数组映射vs过滤器vs?

Javascript Typescript数组映射vs过滤器vs?,javascript,typescript,Javascript,Typescript,下面是一个typescript方法,它希望遍历一个字符串数组,并返回另一个字符串数组,其中,匹配regexp(格式类似“[la la la]”的字符串将变为“la la la”,不匹配的字符串将被删除。因此,如果我的输入数组是: "[x]", "x", "[y]" 它变成 "x", "y" 这是我的密码: questions(): string[] { var regexp = /\[(.*)\]/; return this.rawRecords[0].map((value)

下面是一个typescript方法,它希望遍历一个字符串数组,并返回另一个字符串数组,其中,匹配regexp(格式类似“[la la 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"
return this.rawRecords[0].reduce((acc, value) => {
    console.log(value);
    var match = regexp.exec(value);
    if (match) {
        acc.push(match[1]);
    }
    return acc;
}, []);

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

只需
过滤它们:

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

我真的相信,有时候,我们会尝试去做比我们应该做的更实用的事情。
这有什么问题吗

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;
var regexp=/\[(.*)\]/;
var records=this.rawRecords[0];
var-res=[];
对于(变量i=0,len=records.length;i
它不是一行程序,即使我对TypeScript一无所知(您在问题中也询问了JavaScript),它也应该比任何函数式方法更有效。

另一个选项是这样使用:

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

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

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


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

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

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]);
    }
var arr=[“[xy]”、“x”、“y”];
var-ele=[];
var i;
var-op;
var regex=/\[(.*)\]/;
变量op1=arr.filter((元素)=>
{
op=regex.exec(元素);
如果(op)
电推(op);
否则{
电推力(元件);
控制台日志(op);
}
});

对于(i=0;iYou可以在那之后尝试
.filter(Boolean)
来去除未定义的。我不确定我是否同意你的观点……一旦我在头脑中理解了“map”(来自Ruby)的语义,我发现其中的一行/几行实际上更清晰了。(顺便说一句,我在学习TS的同时学习JS是一件不明智的事情。)(事实上,我知道一些js,但在web应用程序中只写了2行代码)我同意这在很多时候都是非常清晰的(我不使用TS,但使用了很多lodash/下划线)。但是在ruby世界中,你试图做的是在映射后调用,这被认为是错误设计代码的标志。过滤器是什么(x=>!!x)是吗?我知道过滤器的作用,但参数让我困惑。=>正在创建一个匿名函数,但我无法理解该特定表达式的工作原理!@pitosalas它只是在检查该值是否为真。x是一个值,!x是真的,如果x为空或假,!!x基本上将该值转换为布尔值。!!“=false!”=true!!!=true!!!=true!!“=not false”=正确