每个 JavaScript 开发者都应该了解的两个字符串方法。
挑战:
我最近在做一个项目,需要构建一个端点,使客户端能够根据单个日期或日期范围查询 MongoDB 数据库。我知道,这很令人兴奋!
不过,在测试这个接口的时候,我发现查询数据库失败的原因是,我获取到的日期格式是“2019-08-02T00:00:00.000Z”,而我需要的是“2019-08-02”这种格式。所以我需要把时间从日期时间字符串中分离出来,并去掉字符串中的双引号。
如果您感兴趣,我在这里写了一篇关于如何使用日期范围查询 NoSQL 数据库的文章:
我尝试过:
我做了每个值得尊敬的开发者在遇到难题时都会做的事:我在 Stack Overflow 上四处搜索,寻找能够解决问题的正则表达式!
在搜索过程中,我看到很多解决方案虽然有效,但对我来说毫无意义,我不太愿意将它们添加到代码库中。修改那些自己都不理解但又能运行的代码,这种做法我宁愿永远不要养成。
我偶然看到一个答案使用了 JavaScript 字符串的 split() 方法。出于好奇,我在 Google 上搜索了 String 对象,看看能找到什么结果。我不会赘述我找到的所有方法,只会介绍其中解决我问题的两种。
String.prototype.split() 实际应用!
在 MDN 上快速搜索一下,对 split() 方法的描述如下:The split() method turns a String into an array of strings, by separating the string at each instance of a specified separator string.
你可能在想“嗯哼,请用英语说……”,别担心,我也是这么想的。所以这里提供另一种定义:
The split method helps you cut down a desired Mama String into smaller child strings and it performs this separation based on the condition you give it. It then returns the answer back to you as an Array
这个条件称为分隔符。关于分隔符,需要特别注意的是它必须存在于字符串中。所以,如果你指示 split 方法并说: “嘿,我想让你用逗号将名为data 的
母字符串拆分成更小的子字符串。”
Split 说“好的”,然后立即行动!
let data = "data";
data = data.split(',');
console.log(data);
//Expected Result: ["data"];
你可能在想:“等等,split 先生,别以为把字符串放到数组里就能骗过我。” 别急,事情是这样的:我们告诉split() 函数,要用一个母字符串本身没有的分隔符,从母字符串中分割出子字符串。所以母字符串自身会想:“我这里没有逗号,所以不能用逗号分隔。”
但是,如果我们把分隔符改成类似的值,比如字母“a”,会怎么样呢?我们来看看:
let data = "data";
data = data.split('a');
console.log(data);
//Expected Result: ["d", "t", ""];
啊哈!只要找到字母a ,我们就能得到包含小字符串的内容。所以 split() 函数会获取分隔符,并将其用作一个小型搜索条件,将 Mama 字符串在分隔符出现的地方截断。然后,它会跳过分隔符,并返回分隔符之后的所有内容,因此我们在上面的结果中会看到“"” 。
但如果我们只想在少数几个地方进行分离呢?
这样也没问题,`split()` 函数提供了一个可选的`limit`参数,你可以根据需要进行设置,非常方便。不过需要注意的是,一旦达到这个限制,`split` 函数就会停止尝试分割字符串,只返回目前为止分割过的部分。例如,假设我们只想用字母“a”分割字符串一次,不再分割,那么分割后的结果会是这样的:
let data = "data";
data = data.split('a', 1);
console.log(data);
//Expected Result: ["d"];
好的,但这如何解决我的日期时间问题呢?
如果你还记得,我之前有一个日期时间字符串,格式如下:'"2019-08-02T00:00:00.000Z"'。有了新学到的知识,我就可以去掉日期时间字符串中的时间戳部分。这样,我就能得到类似这样的字符串:
let date = '"2019-08-02T00:00:00.000Z"';
date = date.split('T', 1);
console.log(date);
//Expected result: ['"2019-08-02"]
现在我确定了约会日期!但是双引号的问题怎么办?我该如何解决?
String.prototype.replace() 来帮忙啦!
replace()函数的作用是,它接受两个参数:第一个参数是要删除的字符串,第二个参数是要添加的字符串。具体来说,就是:
string.replace(/stringIHate/,'StringILove')
它使用双斜杠来表示要删除的字符串。此外,你还可以添加字母i来指示搜索不区分大小写,或者添加字母g来指示搜索范围更广,即删除字符串中所有包含该字符串的内容。
所以为了解决这个问题,我们会这样使用它:
let date = '"2019-08-02T00:00:00.000Z"';
date = date.split('T', 1);
console.log(date);
//Expected result: ['"2019-08-02"]
//REPLACE METHOD
date = date[0].replace(/"/,"");
console.log(date);
//Expected result: "2019-08-02"
瞧!我终于把日期转换成了我想要的格式。我通过让replace() 函数在返回的数组中搜索字符串,找到双引号并将其替换为空来实现这一点。
链式使用 replace() 和 split():一种更好的方法。
为了提高效率,我们可以通过将字符串方法串联起来来减少需要编写的代码行数。此外,最好先对字符串调用 replace 函数,然后再调用 split 函数,因为这样可以简化代码。因此,我们可以将代码精简如下:
let date = '"2019-08-02T00:00:00.000Z"';
date = date.replace(/"/g, "").split('T',1);
console.log(date);
// Expected Result: ["2019-08-02"];
//This is shorter and more semantic than:
date = date.split('T',1)[0].replace(/"/g, "");
//You could do that however if you don't want the string to be returned as an array
结论
希望这对您有所帮助。在您尝试使用您不太理解但有效的正则表达式来解决字符串相关问题之前,请先深入了解一下 JavaScript 字符串方法。请点赞、分享并留言,以便更多需要的人能够看到这篇文章!
还有哪些字符串方法曾帮助你简化工作?
文章来源:https://dev.to/itz_giddy/two-string-methods-every-javascript-developer-should-know-10e3