JS的一些小练习

 将str中的before字符串用after替换,after的首字母大小写要和before的一样:

function myReplace(str, before, after) {
  let arr=str.split(' ');
  let regex=/^[A-Z]/;
    if(arr.indexOf(before)){
      if(regex.test(before)){
        after=after[0].toUpperCase()+after.slice(1);
      }
      else{
        after=after[0].toLowerCase()+after.slice(1);
      }
      arr[arr.indexOf(before)]=after;
    }
  return arr.join(' ');
}

console.log(myReplace("A quick brown fox Jumped over the lazy dog", "Jumped", "leaped"));//A quick brown fox Leaped over the lazy dog

返回DNA碱基对:

/*法一:function pairElement(str) {
  let arr=str.split('');
  console.log(arr);
  for(let i=0;i<arr.length;i++){
    if(arr[i]==='G'){
      arr[i]=[arr[i],'C'];
    }
    if(arr[i]==='C'){
      arr[i]=[arr[i],"G"];
    }
    if(arr[i]==='A'){
      arr[i]=[arr[i],'T'];
    }
    if(arr[i]==='T'){
      arr[i]=[arr[i],"A"];
    }
  }
  return arr;
}*/
/*法二:function pairElement(str) {
  let matchWithBasePair = function(char, pairedArray) {
    switch (char) {
      case "A":
        pairedArray.push(["A", "T"]);
        break;
      case "T":
        pairedArray.push(["T", "A"]);
        break;
      case "C":
        pairedArray.push(["C", "G"]);
        break;
      case "G":
        pairedArray.push(["G", "C"]);
        break;
    }
  };
  const paired = [];
  for (let i = 0; i < str.length; i++) {
    matchWithBasePair(str[i], paired);
  }

  return paired;
}
 */
//法三:
function pairElement(str) {
  var pairs = {
    A: "T",
    T: "A",
    C: "G",
    G: "C"
  };
  var arr = str.split("");
  return arr.map(x => [x, pairs[x]]);
}
//调用:
console.log(pairElement("GCG"));//[ [ 'G', 'C' ], [ 'C', 'G' ], [ 'G', 'C' ] ]
console.log(pairElement("ATCGA"));//[["A","T"],["T","A"],["C","G"],["G","C"],["A","T"]]

返回小于等于参数num的所有素数之和:

function sumPrimes(num) {
  let prinum=[];
  for(let i=2;i<=num;i++){
    //every返回一个布尔值:用每一次i的值去取余数组中存在的每一个元素,余数不为0即不能整除。
    if(prinum.every(kk=>i%kk!==0)){      
    prinum.push(i);
    console.log(prinum); 
    /*输出如下:
    [ 2 ]
    [ 2, 3 ]
    [ 2, 3, 5 ]
    [ 2, 3, 5, 7 ]
     */
    }
  }
  //求和
  return prinum.reduce((sum,b)=>sum+b,0);
}
console.log(sumPrimes(10));//17

返回两个数之间的最小公倍数:

例如,如果给定1和3,求出1和3的最小公倍数,它可以被1和3之间的所有数字整除,这里答案为6。

function smallestCommons(arr) {
  let newArr=arr.sort((a,b)=>a-b);
  let lastArr=[];
  for(let i=newArr[0];i<=newArr[1];i++){
    lastArr.push(i);
  }
  for(let j=newArr[1];j<=lastArr.reduce((product,a)=>product*a,1);j++){
    const divisible =lastArr.every(a=>j%a==0);
    if(divisible){
      return j;
    }
  }

}
console.log(smallestCommons([1,5]));//60

迭代arr并删除从第一个元素开始的每个元素,直到迭代元素通过函数func时,返回数组的其余部分。否则,返回空数组:

function dropElements(arr, func) {
  let newArr=[];
  for(let i=0;i<arr.length;i++){
    if(func(arr[i])){
      newArr=arr.slice(i);
      return newArr;
    }
  }
  return newArr;
}
//测试:
console.log(dropElements([1, 2, 3], function(n) {return n < 3; }));//[ 1, 2, 3 ]
console.log(dropElements([0, 1, 0, 1], function(n) {return n === 1;})); //[1, 0, 1].
console.log(dropElements([1, 2, 3, 4], function(n) {return n >= 3;})); //[ 3, 4 ]

获取不同层次的嵌套数组的元素,作为一维数组返回:

//法一:
function steamrollArray(arr) {
  let newArr=[];
  for(let i=0;i<arr.length;i++){
    //若有嵌套会返回嵌套的元素个数,没有嵌套则返回undefined。但是用这个方法判断行不通。。。。
    //if(arr[i].length>=1){
    //用Array.isArray()方法判断元素是否为数组!! 
    if(Array.isArray(arr[i])){  
      //递归获取作为数组的内容并将其加进新数组
      newArr.push(...steamrollArray(arr[i]));
    }
    else{
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
//调用:
console.log(steamrollArray([1, [2], [3, [[4]]]]));//[ 1, 2, 3, 4 ]

//法二:
function mySteamrollArray(arr,flatArr=[]) {
  arr.forEach(item => {
    if (Array.isArray(item)) mySteamrollArray(item, flatArr);
    else flatArr.push(item);
  });
  return flatArr;
}
//调用:
console.log(mySteamrollArray([1, [2], [3, [[4]]]]));//[ 1, 2, 3, 4 ]

返回传递的二进制字符串的英文翻译句子:

function binaryAgent(str) {
  let arr=[];
  arr=str.split(' ');
  /*使用map()处理每个元素,将元素从二进制转换为十进制;
   使用String.fromCharCode()将每个ASCII数字转换为相应的字符;
   由于fromCharCode()需要一系列数字而非数组,可以使用ES6的扩展操作符'...'将数字数组作为单个数字传入。*/
  return String.fromCharCode(...arr.map(a=>parseInt(a,2)));
}

//测试:
console.log(binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"));//Aren't bonfires fun!?

检查pre是否包含在collection中,且值的布尔性都为true(在JavaScript中,truethy值是在布尔上下文中计算时转换为true的值):

//法一:
function truthCheck(collection, pre) {
  let booleans=collection.every(a=>a.hasOwnProperty(pre)
  &&a[pre]);
  if(booleans){
    return true;
  }
  return false;
}
//法二:
function truthCheck(collection, pre) {
  return collection.every(obj => obj[pre]);
}
//法三:
function truthCheck(collection, pre) {
  return collection.every(function (element) {
    return element.hasOwnProperty(pre) && Boolean(element[pre]);
  });
}
//调用:
truthCheck([{name: "Quincy", role: "Founder", isBot: false}, {name: "Naomi", role: "", isBot: false}, {name: "Camperbot", role: "Bot", isBot: true}], "isBot");//false

根据围绕地区运动的星体的平均高度换算出其轨道周期(以秒为单位)。根据开普勒第三定律,在圆形或椭圆形轨道上相互围绕的两点质量的轨道周期T为

  • aa is the orbit's semi-major axis
  • GM is the standard gravitational parameter
  • G is the gravitational constant,
  • M is the mass of the more massive body.

将使用到Math.ceil()和Math.round()处理数据;注意对象的取值和更改:

function orbitalPeriod(arr) {
  const GM = 398600.4418;//地球GM值
  const earthRadius = 6367.4447;//地球半径
  let newArr=[];
  //用for..in语法遍历arr对象中的每个项
  for(let elem in arr){
    //四舍五入轨道周期值
    const orbitalPer = Math.round(2 * Math.PI * Math.sqrt(Math.pow(arr[elem].avgAlt + earthRadius, 3) / GM));
    //添加带有orbitalPeriod属性的新对象到newArr(这里的对象取值使用‘.name’也可以)
    newArr.push({name: arr[elem]['name'], orbitalPeriod: orbitalPer});
  }
  return newArr;
}
//avgAlt为平均高度
console.log(orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]));//[ { name: 'sputnik', orbitalPeriod: 86400 } ]

回文结构是指向前和向后拼写相同的单词或句子,忽略标点、符号、大小写和空格。判断给定的字符串是否为回文,是则返回true,否则返回false:

function palindrome(str) {
  //法一:
  let regex=/[A-Za-z0-9]+/g;
  let str1=str;
  let arr=[];
  str1=str.match(regex).join('').toLowerCase();
  for(let i=str1.length-1;i>=0;i--){
    arr.push(str1[i]);
  }
  return str1===arr.join('');
  //法二:
  /*
  let regex=/[A-Za-z0-9]+/g
  let target=str.match(regex).join('').toLowerCase()
  return target==target.split('').reverse().join('')
  */
}

console.log(palindrome("0_ey-e0"));//true

将给定的数字转换为罗马数字:

//法一:
function convertToRoman(num) {
  let roman={
    I:1,II:2,III:3,IV:4,V:5,VI:6,VII:7,VIII:8,IX:9,
    X:10,XX:20,XXX:30,XL:40,L:50,LX:60,LXX:70,LXXX:80,XC:90,
    C:100,CC:200,CCC:300,CD:400,D:500,DC:600,DCC:700,DCCC:800,CM:900,M:1000,MM:2000, MMM:3000,MMMM:4000};//按需添加键值。
  let newNum=num;  
  let arr=String(newNum).split('');//[ '2', '0', '1', '4' ]
  let returnRoman='';
  for(let i =0; i <arr.length; i++){
    for(let j in roman){
    //每位数乘以arr.length-i-1个个数的10,以得到整千、整佰、整拾、个位的数。Math.pow是求幂(乘方)的函数。
    //console.log(arr[i]*Math.pow(10,arr.length-i-1));
      if(arr[i]*Math.pow(10,arr.length-i-1)===roman[j]){
        returnRoman+=j;
    } 
  }
}
return returnRoman;   //.split('').reverse().join('');

  //法二:
  /*var arabicToRoman = {1: "I", 2: "II", 3: "III",  4 : "IV", 5: "V", 6: "VI", 7 : "VII", 8 : "VIII", 9 : "IX", 
10 : "X", 20 : "XX", 30 : "XXX", 40 : "XL", 50 : "L", 60 : "LX", 70 : "LXX", 80 : "LXXX", 90 : "XC", 
100 : "C", 200 : "CC", 300 : "CCC", 400 : "CD", 500 : "D", 600 : "DC", 700 : "DCC", 800 : "DCCC", 900 : "CM", 
1000: "M", 2000: "MM", 3000: "MMM"};

  let arr = String(+num).split(""); //将参数num数组化
  let result = ''; //初始化
  for(let i =0; i <arr.length; i++){
    //找到当前索引值乘以10^i的幂的键  
    let lookupKey = arr[i]*Math.pow(10,arr.length-i-1); 
    if(arabicToRoman[lookupKey]){
      result +=  arabicToRoman[lookupKey];
    }    
  }
  return result;*/

}
//调用:
console.log(convertToRoman(2014));//MMXIV

凯撒密码,也称为移位密码。常用的是ROT13密码,即字母的值移位13位来表示。如A↔N、 B↔O等。

注意String.fromCharCode( )方法、字符串.charCodeAt( )方法的使用。

编写函数,以ROT13编码字符串作为输入,并返回解码字符串(字母均为大写,不要转换任何非字母字符(即空格、标点符号),但要传递它们):

function rot13(str) {
  let regex=/[A-Z]+/g;
  let newStr=str;
  let lastChar=str.match(/\W$/)?str[str.length-1]:'';//获取句尾的标点
  let arr=newStr.split(/\W/).join(' ').match(regex);
  let newArr=[];
  //利用map将一维数组变成二维数组,利用扩展符...
  arr=arr.map(a=>{return arr[a]=[...a]});
  //console.log(arr);
  for(let i=0;i<arr.length;i++){
    newArr[i]=arr.slice(arr[i],1);
    for(let j=0;j<arr[i].length;j++){
      let charCode=arr[i][j].charCodeAt(arr[i][j])+13;
      //字符在大写字母区间
      if(charCode>=65 && charCode<=90){
        newArr[i][j]=String.fromCharCode(charCode);
      }
      //字符超出大写字母区间上限
      else if(charCode>90){
        let char1=String.fromCharCode(arr[i][j].charCodeAt(arr[i][j])-13);
        newArr[i][j]=char1;
      }    
    }
  }
  //console.log(newArr);
  //利用map、join、concat将二维数组里的字符串联取出
  newStr=newArr.map((a,b)=>{a[b]=a.join('');return a[b].concat();}).join(' ');
  return newStr+lastChar;//加上最后的标点。
}
//调用:
console.log(rot13("SERR PBQR PNZC"));//FREE CODE CAMP
console.log(rot13("SERR CVMMN!"));//FREE PIZZA!

 

。。。

posted @ 2022-10-06 21:10  枭二熊  阅读(35)  评论(0编辑  收藏  举报