持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
目录
今日题
题目
兄弟们,啥也不说了,昨天的题我看效果不错,确实帮助到了大家,那么今天我决定再来点特别的题——手写数组的'forEach'(实现一个简易的forEach即可)。要注意,不是用手写,而是polyfill
分析
要注意forEach有哪些特点,比如不可以使用return跳出等等
昨日题
题目
答案
无固定答案,下面展示部分昨天留言的代码:
// FuncJin wrote it on 2022/06/04 23:17
var FuncJin = () => {
var map = new Map([["one", "one1"],["two", "two2"],["three", "three3"]])
return s.replace(/one|two|three/g, v => map.get(v))
}
// 小小栗 wrote it on 2022/06/05 10:11
var XxLi = function () {
var arr = [['one', 'one1'], ['two', 'two2'], ['three', 'three3']]
var arr2 = s.split(' ')
return arr2.map(v => {
var r = arr.find(v2 => new RegExp(v2[0], 'i').test(v))
return r ? r[1] : v
}).join(' ')
}
// 冰阔落治百病 wrote it on 2022/06/05 12:08
var WangLaoQi = function() {
let matcMap = {
"one": "one1",
"two": "two2",
"three": "three3"
}
return s.split(" ").map(value => matcMap[value] ?? value).join(" ");
}
// char wrote it on 2022/06/05 15:47
const char = () => {
const obj = {
"one": "one1",
"two": "two2",
"three": "three3"
}
return s.split(' ').reduce((previous, current,index) => obj[current] ? previous+ obj[current] + " " : previous + current + " " , "").trim()
}
解析
首先这道题的题目是存在一点争议的,具体表现为:var s = 'one two three',因为图片中为中文引号(在这里我也要痛斥一些面试题目,能不能规范点出题,引号、冒号、分号请使用英文,避免混淆题意),所以有的读者可能理解成了var s = ' one two three',要注意这个one前面是有一个空格的,所以这也就导致了部分人使用split方法分割字符串时,会将第一个空格也分割出来了,从而进行一些不必要的操作,那么我认为one之前是不存在空格的,所以也就按照了没有空格的写法,如果真的有空格,你可以使用正则/^\s*|\s*$/或者字符串的trim方法来清除空格,或者你也可以保留原有空格。因为篇幅有限,这里我对第四种代码讲解一下思路和方法,大概就是通过reduce方法来不断累加新值,因为前者split已经将one two three转为了数组['one', 'two', 'three'],(previous, current,index) => obj[current] ? previous+ obj[current] + " " : previous + current + " "的作用就是如果当前的值current在obj中,那么就将current替换为obj中的值,如果不在obj中,则返回原汁原味的previous,要注意的是每次的previous都是对前面值的累加,最后通过trim去除两端空格,然后返回新值。
结语
此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。创作不易,少年,就请留个赞再走吧!