前一段時間在codewars上做了一些Javascript的算法磕昼,主要是和數(shù)組方法和正則表達(dá)式有關(guān)服傍,寫篇博客來記錄一下钱雷,否則這里面包含的知識真的忘得太快了。吹零。罩抗。
## 1. Your order,please.
給定一段順序錯誤的字符串灿椅,字符串里每個單詞都包含一個數(shù)字代表著這個單詞在句子中正確的位置套蒂,返回排序后的字符串。
function order(words){
? return words.split(' ').sort(function(a, b){? ?
? ? return a.match(/\d/) - b.match(/\d/); }).join(' ');`sort(function(a,b){?
? ? ? return a - b;})
sort中的比較函數(shù)茫蛹,可以決定在排好序的數(shù)組中兩個參數(shù)的位置操刀。如果要a在前則要返回一個負(fù)數(shù)(升序排列),反之要返回正數(shù)(降序排列)婴洼。
## 2.Where my anagrams at?
在數(shù)組中找到一個元素骨坑,擁有和字符串完全相同的字母。
function anagrams(word, words) {?
? word = word.split('').sort().join('');?
? return words.filter(function(v) {
? ? return word == v.split('').sort().join('');});}
`filter()`返回一個滿足回調(diào)函數(shù)的新數(shù)組
### 3.Vasya - Clerk
一隊人在電影院門口排隊買票柬采,他們手上有25,50,100三種紙幣欢唾,你作為售票員一開始沒有錢。寫一個函數(shù)判斷是否你有足夠的零錢把票賣給每一個人挺有意思的一道題粉捻,要記住你只有三種面值的紙幣礁遣,所以需要把你收到的25 50 100紙幣的個數(shù)分別記錄。>
function tickets(peopleInLine) {
? var bills = [0, 0, 0];
? for (var i = 0; i < peopleInLine.length; i++) {
? ? switch (peopleInLine[i]) {
? ? ? case 25 : bills[0] ++ break
? ? ? case 50 : bills[0] ?-- ?bills[1] ++ break
? ? ? case 100 : bills[1] ? bills[1]-- : bills[0] -= 2bills[0] -- break
}
? ? if (bills[0] < 0) {return 'NO'}}return 'YES'
## 4.Triple trouble
給你兩串?dāng)?shù)字杀迹,若滿足:第一串中有一個數(shù)字出現(xiàn)三次亡脸,第二串中那個同樣的數(shù)字也出現(xiàn)了兩次就返回true
?function tripledouble(num1, num2) {?
? for (let i = 0; i < 10; i++) {? ?
? ? if (new RegExp(\`${i}{3}\`).test(num1) && new RegExp(\`${i}{2}\`).test(num2)) {? ? ?
? ? ? return 1;? ?
? ? }?
? }?
return 0;
}
RegExp(`${i}{3}`)
RegExp("n{X}") n{X,}?
量詞匹配包含 X 個 n 的序列的字符串押搪。es6表達(dá)式模板字符串(template string)是增強(qiáng)版的字符串树酪,用反引號(`)標(biāo)識。它可以當(dāng)作普通字符串使用大州,也可以用來定義多行字符串续语,或者在字符串中嵌入變量(感覺有點像JSP里的EL表達(dá)式呢)。test() 方法用于檢測一個字符串是否匹配某個模式.如果字符串 string 中含有與 RegExpObject 匹配的文本厦画,則返回 true疮茄,否則返回 false。所以這里的語句 `RegExp(\`${i}{3}\`).test(num1)就是在num1這個字符串中看是否有3個i(1-10)~
## 5.Equal Sides Of An Array
找出使數(shù)組呈現(xiàn)中心對稱的那個元素([1,2,3,4,3,2,1] => 4)中心對稱的那個元素左右兩邊必然相等根暑,利用這個特點就可以了力试。
?function findEvenIndex(arr){?
? for(var i=1; ia+b) === arr.slice(i+1).reduce((a, b) =>? a+b)) {
? ? return i;
? ? }
? }
return -1;
}
arrayObject.slice(start,end) 方法可從已有的數(shù)組中返回選定的元素。`
arr.reduce([callback, initialValue])
reduce() 方法接收一個函數(shù)作為累加器(accumulator)排嫌,數(shù)組中的每個值(從左到右)開始縮減畸裳,最終為一個值。
參數(shù)
callback 執(zhí)行數(shù)組中每個值的函數(shù)淳地,包含四個參數(shù):
previousValue //上一次調(diào)用回調(diào)函數(shù)返回的值怖糊,或者是提供的初始值(initialValue)
currentValue //數(shù)組中當(dāng)前被處理的元素
currentIndex //當(dāng)前被處理元素在數(shù)組中的索引, 即currentValue的索引.如果有initialValue初始值, 從0開始.如果沒有從1開始.
array //調(diào)用 reduce 的數(shù)組
initialValue //可選參數(shù), 作為第一次調(diào)用 callback 的第一個參數(shù)帅容。
reduce`為數(shù)組中的每一個元素依次執(zhí)行回調(diào)函數(shù),不包括數(shù)組中被刪除或從未被賦值的元素伍伤,接受四個參數(shù):
previousValu //上一次值
currentValue //當(dāng)前值
currentIndex //當(dāng)前值的索引
array 數(shù)組
### reduce是如何工作的
例如執(zhí)行下面的代碼
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
? return previousValue + currentValue;
});
? ?| ? ? ? ? ? ? ? ? ? ? ?| previousValue? | currentValue | index ?|return value|
? ?| ------ ? ? ? ? ? ? ?| ----- ? ? ? ? ? ? ? ? ?| ---- ? ? ? ? ? ? ? ?|---- ? ? ? ?|----
? ?| first call ? ? ? ? | 0 ? ? ? ? ? ? ? ? ? ? ?| 1 ? ? ? ? ? ? ? ? ? |? 1 ? ? ? ? ?| 1? ? ? ? ? |
? ?| second call ? ?| 1 ? ? ? ? ? ? ? ? ? ? | 2 ? ? ? ? ? ? ? ? ? ?|? 2 ? ? ? ? | 3? ? ? ? ? |
? ?| third? call ? ? ? | 3 ? ? ? ? ? ? ? ? ? ? ?| 3 ? ? ? ? ? ? ? ? ? |? 3 ? ? ? ? ?| 6? ? ? ? ? |
? ?| fourth call ? ? ?| 6 ? ? ? ? ? ? ? ? ? ? ?| 4 ? ? ? ? ? ? ? ? ? |? 4? | ? ? ? ?10? ? ? ? |
當(dāng)有`initialValue`時并徘,previousValue的初始值為`initialValue`,并且index從0開始回調(diào)
還可以用箭頭函數(shù)(es6新增)來寫callback
ES6允許用 =>?來寫函數(shù)
var f = v =>v` = `var f = function(v) {return v;};
當(dāng)參數(shù)有多個或者沒有時扰魂,要用小括號`()`包裹麦乞,如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號`{}`將它們括起來劝评,并且使用return語句返回路幸。由于大括號被解釋為代碼塊,所以如果箭頭函數(shù)直接返回一個對象付翁,必須在對象外面加上括號简肴。
var sum = (num1, num2) => num1 + num2;等于
var sum = function(num1, num2) {
return num1 + num2;
};
返回對象
var getTempItem = id => ({ id: id, name: "Temp" });
總結(jié): 對那些數(shù)組方法還有正則的用法太不熟悉了..很多時候第一反應(yīng)都是用for做循環(huán),大一c留下的坑百侧。ES6以后要從頭到尾看一遍砰识,很有用的說。
博客地址:renkosky.github.io 同步更新哦