刚学JS的我在codewars上做了一个难度7kyu的题目
题目为 Exes and Ohs
连结如下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方式下去解
function XO(str) {//因为题目给的是字串且有大小写问题,所以用toUpperCase都先转成大写,再用split('')转成阵列型态。 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
虽然都可以解的出来,但如果追求精简导致后来的自己看不懂就不好了!