1、Sum All Numbers in a Range
我们会传递给你一个包含两个数字的数组。返回这两个数字和它们之间所有数字的和。
最小的数字并非总在最前面。
①扩展语句方法
function sumAll(arr) {
var a=Math.max(...arr);
var b=Math.min(...arr);
var i=a,sum=0;
while(i>=b){
sum=sum+i;
i--;
}
return sum;
}
sumAll([1, 4]);
初期写的a=Math.max(arr)方式并不能识别出参数,Math.max()方法需输入每一个参数而不能数组形式,故而运用了扩展语句的方法。
扩展语句
let parts = ['shoulder', 'knees'];
let Tshirts = ['Lee', 'Nike'];
let lyrics = ['head', ...parts, 'and', 'toes'];
// ["head", "shoulder", "knees", "and", "toes"]
let lyrics = ['head', ...parts, 'and', 'toes', ...Tshirts];
// ["head", "shoulder", "knees", "and", "toes", "Lee", "Nike"]
我的理解是可以把数组的元素以参数形式输入。当然或许并不仅仅此作用,扩展语句仅适用于ES6语法。
2、Diff Two Arrays
比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。
function diff(arr1, arr2) {
var newArr = [];
// 循环查看arr1中不存在arr2数据的index并导出
for(var i=0;i
3、Roman Numeral Converter
将给定的数字转换成罗马数字。
所有返回的 罗马数字 都应该是大写形式。
function convert(num) {
var arry=[];
var nums=[1000,900,500,400,100,90,50,40,10,9,5,4,1];
var Roman=['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I'];
nums.forEach(function(item,index,array){
while(num>=item){
arry.push(Roman[index]);
num=num-item;
}
});
return arry.join('');
}
convert(36);
相比于设立很多if条件获得num的罗马数字,这种数组方式显然更加简单,在if情况多的时候可以借鉴该方法,nums数组为各个特殊情况条件,Roman数组为各个条件对应的情况,通过forEach方法可以将两种数组对应起来。
forEach()方法
语法:
array.forEach(callback(currentValue, index, array){
//do something
}, this)
array.forEach(callback[, thisArg])
callback 函数会被依次传入三个参数:
数组当前项的值
数组当前项的索引
数组对象本身
4、Pig Latin
把指定的字符串翻译成 pig latin。
Pig Latin 把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 "ay"。如果单词以元音开始,你只需要在词尾添加 "way" 就可以了。
function translate(str) {
var iarray=['a','e','i','o','u'];
if(iarray.indexOf(str[0])>=0||iarray.indexOf(str[0].toLowerCase())>=0){
str=str+'way';
}
else{
var num=0;
for(var i=1;i
String.substr()方法
返回一个字符串中从指定位置开始到指定字符数的字符
str.substr(start[, length])
start
开始提取字符的位置。如果为负值,则被看作 strLength + start,其中 strLength 为字符串的长度(例如,如果 start 为 -3,则被看作 strLength + (-3))。
length
可选。提取的字符数。
String.substring()方法
返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集
str.substring(indexStart[, indexEnd])
DNA Pairing
DNA 链缺少配对的碱基。依据每一个碱基,为其找到配对的碱基,然后将结果作为第二个数组返回。
Base pairs(碱基对) 是一对 AT 和 CG,为给定的字母匹配缺失的碱基。
在每一个数组中将给定的字母作为第一个碱基返回。
例如,对于输入的 GCG,相应地返回 [["G", "C"], ["C","G"],["G", "C"]]
字母和与之配对的字母在一个数组内,然后所有数组再被组织起来封装进一个数组。
function pair(str) {
var arr=str.split('');
var arr1=['A','C'],arr2=['T','G'];
var array=[];
for(var i=0;i=0&&num2<0){
array.push([arr[i],arr2[num1]]);
}
else {
array.push([arr[i],arr1[num2]]);
}
}
return array;
}
pair("GCG");
将对应的情况封装在两个数组中,这样在其中一个出现的索引就是配对数组中的索引,可以使代码更简洁。
String.split() 方法
使用指定的分隔符字符串将一个String
对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。
str.split([separator[, limit]])
separator:可以是一个字符串或[正则表达式]。 如果纯文本分隔符包含多个字符,则必须找到整个字符串来表示分割点。如果在str中省略或不出现分隔符,则返回的数组包含一个由整个字符串组成的元素。如果分隔符为空字符串,则将str原字符串中每个字符的数组形式返回。
limit:限定返回的分割片段数量。
Missing letters
从传递进来的字母序列中找到缺失的字母并返回它。
如果所有字母都在序列中,返回 undefined。
function fearNotLetter(str) {
var num1=[],num2=[];
for(var i=0;i
关于charCodeAt()和String.fromCharCode(num)的用法,可以思考一下中间缺失多个字母时的代码。
Sorted Union
写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组。
换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值。
非重复的数字应该以它们原始的顺序排序,但最终的数组不应该以数字顺序排序。
function unite(arr1, arr2, arr3) {
var arr=Array.from(arguments);
var exarr=[];
for(var i=0;i
之前陷入了比较两个数组提取不重复的元素的死胡同,创建的空白数组作为有无重复元素的标准,没有重复的放入空白数组中这样的方法明显更方便。
关于arguments对象的使用,可以通过arr=Array.from(arguments)这样的方法将其转化为数组。
Sum All Primes
求小于等于给定数值的质数之和。
只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。
给定的数不一定是质数。
function sumPrimes(num) {
var sum=0;
for(var i=2;i<=num;i++){
var isPrime=true;
for(var j=2;j
熟练运用布尔值作为判断标准可以节省很多不必要的步骤。
Smallest Common Multiple
找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
function smallestCommons(arr) {
arr.sort(function(a,b){
return a-b;
});
function gcd(m,n){
if(m%n===0){
return n;
}
else{
return gcd(n,m%n);
}
}
var com=arr[0];
for(var i=arr[0]+1;i<=arr[1];i++){
com=com*i/gcd(i,com);
}
return com;
}
smallestCommons([1,5]);
首先对输入的数组进行排序,最小公倍数就是两个数的乘积除以他们的最大公约数,最大公约数采用的是辗转相除法,即函数gcd()的定义。
Finders Keepers
写一个 function,它遍历数组 arr,并返回数组中第一个满足 func 返回值的元素。举个例子,如果 arr 为 [1, 2, 3],func 为 function(num) {return num === 2; },那么 find 的返回值应为 2。
function find(arr, func) {
var num=0;
for(var i=0;i
函数作为函数的参数的使用,该例中的func返回的是true和false。
Steamroller
对嵌套的数组进行扁平化处理。你必须考虑到不同层级的嵌套。
function steamroller(arr) {
// I'm a steamroller, baby
var newarray=[];
function roll(array){
for(var i=0;i
可以使用全局变量,这样只需要定义一个函数就可以,但是在FCC中需要运行多次测试结果,全局变量会引发错误。
Binary Agents
传入二进制字符串,翻译成英语句子并返回。
function binaryAgent(str) {
var arr=str.split(' ');
var numcode=[];
var newstr='';
for(var i=0;i
String.fromCharCode()方法是静态函数,不能定义新字符串。
Everything Be True
所有的东西都是真的!
完善编辑器中的every函数,如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真。函数返回ture。反之,返回false。
function every(collection, pre) {
// Is everyone being true?
function beTrue(element,index,array){
return element[pre];
}
return collection.every(beTrue);
}
every([{"user": "Tinky-Winky", "sex": "male", "age": 0}, {"user": "Dipsy", "sex": "male", "age": 3}, {"user": "Laa-Laa", "sex": "female", "age": 5}, {"user": "Po", "sex": "female", "age": 4}], "age");
arr.every(callback[, thisArg])
callback 被调用时传入三个参数:元素值,元素的索引,原数组。这种方式会遍历数组的每一个元素,判断其是否符合函数,返回true或者false。
Arguments Optional
创建一个计算两个参数之和的 function。如果只有一个参数,则返回一个 function,该 function 请求一个参数然后返回求和的结果。
例如,add(2, 3) 应该返回 5,而 add(2) 应该返回一个 function。
调用这个有一个参数的返回的 function,返回求和的结果:
var sumTwoAnd = add(2);
sumTwoAnd(3) 返回 5。
如果两个参数都不是有效的数字,则返回 undefined。
function add(x) {
var args = Array.prototype.slice.call(arguments);
var result = args.every(function(item) {
return Number.isFinite(item);
});
if (result === false) {
return undefined; }
else {
if (args.length === 2) {
return args[0] + args[1];
}
else {
var a = args[0];
return function(b) {
if (Number.isFinite(b)) {
return a + b;
}
else {
return undefined;
} }; } } }
add(2)(3);
一、arguments可以转化成数组的形式,Array.prototype.call(arguments)
二、关于every()的用法
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再 进行检测。如果所有元素都满足条件,则返回 true。
every() 不会对空数组进行检测。
every() 不会改变原始数组。
三、Number.isFinite()和Number.isNaN()
和全局的 isFinite()(该全局 isFinite() 函数用来判断被传入的参数值是否为一个有限数值(finite number)。在必要情况下,参数会首先转为一个数值。) 函数相比,这个方法不会强制将一个非数值的参数转换成数值,这就意味着,只有数值类型的值,且是有穷的(finite),才返回 true。
isNaN() 函数用来确定一个值是否为NaN ,必要时转化参数为数值再验证,Number.isNaN()不会强制将参数转换成数字,只有在参数是真正的数值类型,且值为 NaN
的时候才会返回 true
。
Friendly Date Ranges
让日期区间更友好!
把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式。
易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1).
记住不要显示那些可以被推测出来的信息: 如果一个日期区间里结束日期与开始日期相差小于一年,则结束日期就不用写年份了;在这种情况下,如果月份开始和结束日期如果在同一个月,则结束日期月份也不用写了。
另外, 如果开始日期年份是当前年份,且结束日期与开始日期小于一年,则开始日期的年份也不用写。
function makeFriendlyDates(arr) {
var prearr=arr[0].split('-');
var beharr=arr[1].split('-');
var month=['January','February','March','April','May','June','July','August','September','October','November','December'];
var date=['st','nd','rd'];
var result,Numpre=parseInt(prearr.join(''),10),Numbeh=parseInt(beharr.join(''),10);
//更改月份日期
function change(array){
var newarr=[];
newarr[0]=month[parseInt(array[1])-1];
var a=parseInt(array[2]);
var reg=/[^1][1-3]$/g;
if(reg.test(array[2])){
var b=array[2].match(reg);
if(b>10){
newarr[1]=a+date[b[0][1]-1];
}
else{
newarr[1]=a+date[b-1];
}
}
else{
newarr[1]=a+'th';
}
if(array[0]=='2017'){
return newarr;
}
else{
newarr[1]=newarr[1]+',';
newarr[2]=array[0];
return newarr;
}
}
var pre=change(prearr);
var beh=change(beharr);
//格式不对的输入,相同的日期
if(Numpre-Numbeh>0){
result=undefined;
}
else if(Numpre===Numbeh){
result=[pre.join(' ')];
}
else if(prearr[0]==beharr[0]){
//年份相同,月份相同和不相同的情况
if(prearr[1]===beharr[1]){
result=[pre.join(' '),beh[1]];
}
else{
result=[pre.join(' '),beh[0]+' '+beh[1].replace(/,/,'')];
}
}
//年份不相同的情况,相差小于1年,相差大于一年
else if(Numbeh-Numpre<10000){
result=[pre.join(' '),beh[0]+' '+beh[1].replace(/,/,'')];
}
else{
result=[pre.join(' '),beh.join(' ')];
}
return result;
}
makeFriendlyDates(["2008-10-31", "2009-10-31"]);