JS 學習reduce內做Object計算
連結如下 https://www.codewars.com/kata/exes-and-ohs/javascript
題目是判斷OX的數量是否相等
如果一樣回傳true,不同則false,沒有半個OX也會是true。
好不容易用split
解出來後,結果被同學用reduce
的解法給驚豔到!
特別寫這篇來記錄一下
解法是用 devdocs.io 內介紹的一種reduce
用法
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (allNames, name) {
if (name in allNames) { //如果name這個 Key已經有在allNames裡面了的話
allNames[name]++;
}
else {
allNames[name] = 1;
}
return allNames;
}, {});
// countedNames is:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
出處 https://devdocs.io/javascript/global_objects/array/reduce
內的Counting instances of values in an object
裡面的reduce
先把allNames設為一個Object,之後用if判斷name這個Key在不在allNames裡面,再去做object給值的動作。
這招沒想到可以用在OX題目上面啊!
上面reduce
的結果我用兩種for迴圈再寫了一遍
var ary = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var alname = {}; //存放的Object
//第一種普通的for迴圈寫法
function forFoReduce(ary1){
for(var i = 0 ; i < ary1.length ; i++){
//判斷alname的ary1[i]這個 Key的Value是不是NaN,是的話等於一
if(isNaN( alname[ary1[i]] )){
alname[ary1[i]] = 1;
}
else {
alname[ary1[i]]++; //已經等於1了的話就再+1
}
}
return alname;
}
//第二種for迴圈寫法
function forFoReduce2(ary1){
//item是ary1每個陣列內容,就像是上面for迴圈的ary1[i]
for(let item of ary1) {
if(isNaN( alname[item] )){ //把item當作alname的 Key放進去比對
alname[item] = 1; //Key內的Value是NaN的話就 = 1
}
else {
alname[item]++; //已經找到過了就再加一
}
}
return alname;
}
以上介紹的三種方法都會產出:
{ ‘Alice’: 2, ‘Bob’: 1, ‘Tiff’: 1, ‘Bruce’: 1 }
了解到這些解法的話再來挑戰一次OX題目吧!
以下私心用for of方式下去解
//因為題目給的是字串且有大小寫問題,
//所以用toUpperCase都先轉成大寫,
//再用split('')轉成陣列型態。
function XO(str) {
var ary = str.toUpperCase().split('');
var alname = {}; //宣告一個空的Object
for(let item of ary) {
//如果alname裡面的item這個 Key的Value是NaN的話,等於一
if(isNaN( alname[item] )){
alname[item] = 1;
}
else{
alname[item]++; //不是NaN就再加一
}
}
return alname.O === alname.X; //這裡回傳O跟X兩個 Key的Value有沒有一樣
} //一樣回傳true反之回傳false
小結
雖然都可以解的出來,但如果追求精簡導致後來的自己看不懂就不好了!