前言
最近迎来了春招的热潮,相信很多同学都在准备着春招叭,我也在积极的准备着,想把JS基础再巩固一遍,把js方法总结一下。但是靠死记硬背是不可取的,要学会具体使用,在刷题的场景中记住某个JS方法的调用。这篇文章就是把在刷题中遇到的常见JS方法总结出来。
在刚开始学习JavaScript时,会经常刷Codewars,对学习JavaScript语法用处非常大,还有一个原因是刚开始觉得刷LeetCode太难了。
toString()
1.把数字转换为字符串;
2.转进制数,括号中写入‘2’,可以转成二进数。
-
题目:实现一个将两个数字加在一起并以二进制形式返回其总和的函数。转换可以在添加之前或之后进行。 返回的二进制数应为字符串。
解题代码:
// 二进制加法 function addBinary(a,b) { return (a+b).toString(2) } console.log(addBinary(1,8));输出结果:
split()
把一个字符串分割成字符串数组。
-
题目:编写一个函数,该函数以整数作为输入,并返回该数字的二进制表示形式中等于1的位数。您可以保证输入为非负数。
示例:1234的二进制表示形式
10011010010,因此5在这种情况下该函数应返回 解题代码:
var countBits = function(n) {
return n.toString(2).split('0').join('').length
};
repeat()
字符串复制指定次。
- 题目:Build Tower;通过以下给定参数构建塔:楼层数(整数,且始终大于0)。
例如:6层塔
[' * ', ' *** ', ' ***** ', ' ******* ', ' ********* ', '***********' ]
解题代码:
function towerBuilder(nFloors) {
var arr=[]
for(let i=0;i<nFloors;i++){
arr.push(" ".repeat(nFloors-i-1)+"*".repeat(2*i+1)+" ".repeat(nFloors-i-1));
}
return arr;
}
replace()
在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
- 题目:您的任务是编写一个函数,该函数接受一个字符串并返回一个删除了所有元音的新字符串。 例如,字符串“This website is for losers LOL!” 会变成“ Ths wbst s fr lsrs LL!”。
解题代码:
function disemvowel(str) {
return str.replace(/[aeiou]/gi, '');
}
这里面使用了replace()+正则,让代码非常简洁优美。
trim()
用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符等。
注意:不适用于 null, undefined, Number 类型。
- 题目:Dubstep;例如,带有单词“ I AM X”的歌曲可以转换为“ WUBWUBIWUBAMWUBWUBX”的混音混音,而不能转换为“ WUBWUBIAMWUBX”。 例如:
songDecoder("WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB")
// => WE ARE THE CHAMPIONS MY FRIEND
解题代码:
function songDecoder(song){
return song.replace(/(WUB)+/g," ").trim()
}
match()
可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
- 题目:检查字符串是否包含相同数量的“ x”和“ o”。该方法必须返回一个布尔值并且不区分大小写。该字符串可以包含任何字符。 例如:
XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false
解题代码:
let x = str.match(/x/gi);
let o = str.match(/o/gi);
return (x && x.length) === (o && o.length);
toUpperCase()
toUpperCase()用于把字符串转换为大写。
toLowerCase() 方法用于把字符串转换为小写。
- 题目:rgb功能不完整。完成它,以便传入RGB十进制值将导致返回十六进制表示形式。RGB的有效十进制值为0-255。任何超出该范围的值都必须四舍五入为最接近的有效值。 例如:
rgb(255, 255, 255) // returns FFFFFF
rgb(255, 255, 300) // returns FFFFFF
rgb(0,0,0) // returns 000000
rgb(148, 0, 211) // returns 9400D3
解题代码:
function rgb(r, g, b){
// complete this function
r=a(r);
g=a(g)
b=a(b)
let arr=r.toString(16).toUpperCase()+g.toString(16).toUpperCase()+b.toString(16).toUpperCase()
console.log(arr);
}
function a(n){
if(n>255){return n=255}
else if(n<=0){return n='00'}
else{return n}
}
for in
for...in 语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。
- 题目:现代罗马数字的书写方式是,从最左边的数字开始分别表示每个数字,然后跳过任何零值的数字。 例如:
solution(1000); // should return 'M'
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
解题代码:
function solution(number){
// convert the number to a roman numeral
var roman = {M:1000,CM:900, D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1 }
var ans = '';
while(number>0){
for(a in roman){
if(roman[a]<=number){ ans += a; number-=roman[a]; break;}
}
}
return ans;
}
forEach
用于调用数组的每个元素,并将元素传递给回调函数。
- 题目:间隔由一对以数组形式的整数表示。间隔的第一个值将始终小于第二个值。间隔示例:[1, 5]从1到5的间隔。此间隔的长度为4。 例子:
sumIntervals( [
[1,2],
[6, 10],
[11, 15]
] ); // => 9
sumIntervals( [
[1,4],
[7, 10],
[3, 5]
] ); // => 7
sumIntervals( [
[1,5],
[10, 20],
[1, 6],
[16, 19],
[5, 11]
] ); // => 19
解题代码:
function sumIntervals(intervals){
//TODO
var numbers ={}
intervals.forEach(function(x){
for(var i =x[0];i<x[1];i++){
numbers[i]=i
}
})
// return Object.keys(numbers).length
return numbers
}
map()
map() 方法返回一个新数组,不会改变原数组。数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
-
题目:该数字89是具有一个以上位数的第一个整数,该整数满足该kata标题中部分引入的属性。
有效: 89 = 8^1 + 9^2
具有此属性的下一个数字是135。
再次查看此属性: 135 = 1^1 + 3^2 + 5^3 例如:
sumDigPow(1, 10) == [1, 2, 3, 4, 5, 6, 7, 8, 9]
sumDigPow(1, 100) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 89]
解题代码:
function sumDigPow(a, b) {
// Your code here
var res=[]
var arr,sum =0
for(let i=a;i<=b;i++){
arr=i.toString().split('').map(Number)
sum=0;
for(let j=0;j<arr.length;j++){
sum +=Math.pow(arr[j],j+1)
}
if(i===sum){
res.push(i)
}
}
return res
}
reduce()
接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
注意:可以作为一个高阶函数,用于函数的 compose
上一题的另一种解法:
function sumDigPow(a, b) {
var ans = [];
while(a <= b){
//reduce()累加
if(a.toString().split('').reduce((x,y,i)=>x + (+y) ** (i + 1),0) == a)
ans.push(a);
a++;
}
return ans;
}
indexOf()
可返回某个指定的字符串值在字符串中首次出现的位置。
- 题目:超市里有一个自助结账的队列。您的任务是编写一个函数,计算所有客户退房所需的总时间! 例子:
queueTime([5,3,4], 1)
// should return 12
// because when there is 1 till, the total time is just the sum of the times
queueTime([10,2,3,3], 2)
// should return 10
// because here n=2 and the 2nd, 3rd, and 4th people in the
// queue finish before the 1st person has finished.
queueTime([2,3,10], 2)
// should return 12
解题代码:
let temp = Array(n).fill(0)
customers.map(item => {
let idx = temp.indexOf(Math.min(...temp))
temp[idx] += item
})
return Math.max(...temp)
一些简单常用的js方法
下面是一些在解题中需要穿插使用的js方法,比较简单基础,就不一 一拿出题目来浪费时间了。
- charAt 第几个开始索引
//chatAt
var s="I am xiaochen"
console.log(s.charAt(6))
执行结果:
- slice 按位置取 可从已有的数组中返回选定的元素。(和split()方法区别开)
var arr=[1,2,3,4,5,6]
var res=arr.slice(2,5) //截取第二个到第五个
console.log(res)
执行结果:
- join 连接起来 把数组中的所有元素放入一个字符串。
//join
var arr=[ 'I', 'am', 'xiaochen']
console.log(arr.join(' '))//括号内可以写拼接的符号,这里使用了空字符
执行结果:
总结
发现以前觉得比较模糊的js方法,自己手敲一遍,查看执行结果,可以记忆的更加牢固了。其实这些方法都不难,但是要在题目中合理的应用,就比如刷Codewars,可以将大篇幅的代码简化成几句代码,甚至是一句代码,会觉得非常的神奇,更加激励我去深度的学习js。这篇文章是将我在刷题中经常遇到的js方法做了一个总结,最重要的还是在具体场景中的使用。
在这里我也非常的推荐刚学JavaScript的同学去刷CodeWars,它不需要刷很多的题量,会根据你写的代码打分,分数会决定你的等级,非常的有意思。
本人是在校大三学生,正在准备春招,如果有一起学习的小伙伴,欢迎加我好友鸭!wx:chen0105123