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!
。。。