从Codewars刷题中总结js 常用方法

1,305 阅读5分钟

前言

最近迎来了春招的热潮,相信很多同学都在准备着春招叭,我也在积极的准备着,想把JS基础再巩固一遍,把js方法总结一下。但是靠死记硬背是不可取的,要学会具体使用,在刷题的场景中记住某个JS方法的调用。这篇文章就是把在刷题中遇到的常见JS方法总结出来。

在刚开始学习JavaScript时,会经常刷Codewars,对学习JavaScript语法用处非常大,还有一个原因是刚开始觉得刷LeetCode太难了。

image.png

toString()

1.把数字转换为字符串;

2.转进制数,括号中写入‘2’,可以转成二进数。

  • 题目:实现一个将两个数字加在一起并以二进制形式返回其总和的函数。转换可以在添加之前或之后进行。 返回的二进制数应为字符串。

    解题代码:

      // 二进制加法
      function addBinary(a,b) {
      return (a+b).toString(2)
      }
      console.log(addBinary(1,8));
    

    输出结果:

image.png

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))

执行结果:

image.png

  • slice 按位置取 可从已有的数组中返回选定的元素。(和split()方法区别开)
var arr=[1,2,3,4,5,6]
var res=arr.slice(2,5) //截取第二个到第五个
console.log(res)

执行结果:

image.png

  • join 连接起来 把数组中的所有元素放入一个字符串。
//join
var arr=[    'I',    'am',    'xiaochen']
console.log(arr.join(' '))//括号内可以写拼接的符号,这里使用了空字符

执行结果:

image.png

总结

发现以前觉得比较模糊的js方法,自己手敲一遍,查看执行结果,可以记忆的更加牢固了。其实这些方法都不难,但是要在题目中合理的应用,就比如刷Codewars,可以将大篇幅的代码简化成几句代码,甚至是一句代码,会觉得非常的神奇,更加激励我去深度的学习js。这篇文章是将我在刷题中经常遇到的js方法做了一个总结,最重要的还是在具体场景中的使用。

在这里我也非常的推荐刚学JavaScript的同学去刷CodeWars,它不需要刷很多的题量,会根据你写的代码打分,分数会决定你的等级,非常的有意思。

本人是在校大三学生,正在准备春招,如果有一起学习的小伙伴,欢迎加我好友鸭!wx:chen0105123