寫在前頭
- 身為一個JS學(xué)渣,每天都在冥思苦想怎么變成一個大師,在看到“學(xué)一門后端語言,有助于進階Js水平”這類話后,開始興沖沖地學(xué)習(xí)后端語言
(怎么說前端后端真的差很多啊(′?_?`)后端輸出好少嚶嚶嬰,暫時感受不到成就感的說)
(一天打漁,一星期曬網(wǎng)中)
(認(rèn)真過一遍《JS高級程序設(shè)計》才是正途吧呀喂\(`0′)/)。
--------話說作為一枚小前端,也應(yīng)該了解一些后端語言嚯!(? ??_??)?--------
- 言歸正傳,不知為啥雖然看不下那么厚一本《J高》,但是還是要有點追求?。。?/li>
- 于是某天,我發(fā)現(xiàn)了Codewars!
- Codewars是啥?看標(biāo)題(? ̄▽ ̄)? 就是各類代碼的小測試小闖關(guān)啦
- 臥槽!搞起!
好吧,那就搞起唄(*?▽?)
請聽題!
一、創(chuàng)建一個方法來接收數(shù)組,并返回值為首字母為大寫,其余字母小寫的數(shù)組。
Create a method that accepts an array of names, and returns an array of each name
with its first letter capitalized.
example
capMe(['jo', 'nelson', 'jurie']) // returns ['Jo', 'Nelson', 'Jurie']
capMe(['KARLY', 'DANIEL', 'KELSEY']) // returns ['Karly', 'Daniel', 'Kelsey']
( ??Д?)?<
- 碎碎念部分:作為一個渣,第一個想法就是,so easy,恩,先把值拆成兩部分,第一個部分就是首字母啦,然后把它變成大寫噠,剩下都變成小寫噠,恩,直觀又簡單!搞起呀!
- 涉及到的方法等:
-
toUpperCase()轉(zhuǎn)換為大寫 -
toLowerCase()轉(zhuǎn)換為小寫 -
charAt()返回給定位置的單個字符串(從0個開始算就不說啦┐(‘~`;)┌) -
slice(3,7)返回給定位置開始的字符串
(如果有兩個值,就是給定位置之間字符串,這里給的就是返回第4~7這四位字符串)
(注意:slice()計算位置包括空格,若要不包括,要使用substring())
(我們這邊暫時用啥都可以啦,因為,沒有空格嘛(≧?≦)/) - 我的代碼:
function capMe(names) {
for (var i = 0; i < names.length; i++){
var firstLetter = names[i].charAt(0).toUpperCase();
var remainLetter = names[i].slice(1).toLowerCase();
names[i] = firstLetter + remainLetter;
names = names.slice();
}
return(names);
}
中間用了concat()來傳遞字符串,然后寫錯了一些代碼,結(jié)果就在數(shù)組末尾多了一個undefined
WHY?。?!(?_?)
不過!終于通過了?。???)
然后,我就提交了,再然后,就可以看到一些大師的代碼(#/。\#)
看完感覺寫了好多廢代碼的說,雖然通過了還是有點小問題,看了別人的代碼以后自己改進了一下。
function capMe(names) {
for (var i = 0; i < names.length; i++){
names[i] = names[i].charAt(0).toUpperCase() + names[i].slice(1).toLowerCase();
}
return(names);
}
然后,想了想,應(yīng)該也可以用傳說中吊吊的正則,不過,這個暫時放后吧,不大懂不大懂。
- 先來個版本,這是先都小寫再首字母大寫,substring里面的
names[i].length可以去了
function capMe(names) {
for (i = 0; i < names.length; i++)
{
names[i] = names[i].toLowerCase();
names[i] = names[i].substring(0, 1).toUpperCase() + names[i].substring(1, names[i].length);
}
return names;
}
- 再來個版本,倆map也是暈了
function capMe(names) {
return names.map(function(name) {
return name[0].toUpperCase() + name.slice(1).split('').map(function(elem, index) {
return elem.toLowerCase();
}).join('');
});
}
- 再看看贊最多的代碼
function capMe(names) {
return names.map(
function (n) { return n.charAt(0).toUpperCase() + n.substring(1).toLowerCase();
});
}
為什么這么短?。?! _(:з」∠)_
容我仔細瞅瞅,哎喲喂~思路跟我一樣嘛((」?ヘ?)」這很正常吧)
看來我很有當(dāng)大神的潛質(zhì)嘛!(湊不要臉??)_
這么多人用map!醉了醉了醉了!
我要翻翻我的《J高》了(Σ(っ °Д °;)っ你剛剛寫代碼的時候不是一直在翻嗎?。。?/p>
⊙︿⊙沒找到
那就只好谷歌一下了。
這就是map() 的介紹啦。
打不開的我把相關(guān)介紹附在后面了(?′?`?)
看他們舉的例子就造了(map()相當(dāng)于把數(shù)組的每個元素的值,以及索引,以及數(shù)組本身都傳了進去)
function fuzzyPlural(single) {
var result = single.replace(/o/g, 'e');
if( single === 'kangaroo'){
result += 'se';
}
return result;
}
var words = ["foot", "goose", "moose", "kangaroo"];
console.log(words.map(fuzzyPlural));
// ["feet", "geese", "meese", "kangareese"]
很炫酷的樣子嘛。
話說Jquery也有個map(),這兩者有啥不同嗎?
JQuery map()
定義和用法
map() 把每個元素通過函數(shù)傳遞到當(dāng)前匹配集合中,生成包含返回值的新的 jQuery 對象。
語法
.map(callback(index,domElement))
參數(shù)
callback(index,domElement)
描述
對當(dāng)前集合中的每個元素調(diào)用的函數(shù)對象。
對比一下上下這倆解釋,差不多嘛(???)就是JQ中不返回數(shù)組本身罷了。
Array.prototype.map()
概述
map() 方法返回一個由原數(shù)組中的每個元素調(diào)用一個指定方法后的返回值組成的新數(shù)組。
語法
array.map(callback[, thisArg])
參數(shù)
-
callback
原數(shù)組中的元素經(jīng)過該方法后返回一個新的元素。
-
currentValue
callback 的第一個參數(shù),數(shù)組中當(dāng)前被傳遞的元素。
-
index
callback 的第二個參數(shù),數(shù)組中當(dāng)前被傳遞的元素的索引。
-
array
callback 的第三個參數(shù),調(diào)用 map 方法的數(shù)組。
-
thisArg
執(zhí)行 callback 函數(shù)時 this 指向的對象。
描述
- map 方法會給原數(shù)組中的每個元素都按順序調(diào)用一次 callback 函數(shù)。callback 每次執(zhí)行后的返回值組合起來形成一個新數(shù)組。 callback 函數(shù)只會在有值的索引上被調(diào)用;那些從來沒被賦過值或者使用 delete 刪除的索引則不會被調(diào)用。
- callback 函數(shù)會被自動傳入三個參數(shù):數(shù)組元素,元素索引,原數(shù)組本身。
- 如果 thisArg 參數(shù)有值,則每次 callback 函數(shù)被調(diào)用的時候,this 都會指向 thisArg 參數(shù)上的這個對象。如果省略了 thisArg 參數(shù),或者賦值為 null 或 undefined,則 this 指向全局對象 。
- map 不修改調(diào)用它的原數(shù)組本身(當(dāng)然可以在 callback 執(zhí)行時改變原數(shù)組)。
- 當(dāng)一個數(shù)組運行 map 方法時,數(shù)組的長度在調(diào)用第一次 callback 方法之前就已經(jīng)確定。在 map 方法整個運行過程中,不管 callback 函數(shù)中的操作給原數(shù)組是添加還是刪除了元素。map 方法都不會知道,如果數(shù)組元素增加,則新增加的元素不會被 map 遍歷到,如果數(shù)組元素減少,則 map 方法還會認(rèn)為原數(shù)組的長度沒變,從而導(dǎo)致數(shù)組訪問越界。如果數(shù)組中的元素被改變或刪除,則他們被傳入 callback 的值是 map 方法遍歷到他們那一刻時的值。
那今天就寫到這啦。
晚安么么噠(?′?`*)?
補一句:自己寫完看別人的代碼,感慨萬千,寫法千千萬啊( ̄(エ) ̄)ゞ