刚接触JS的新手__ 学习 reduce内做Object的计算

刚学JS的我在codewars上做了一个难度7kyu的题目
题目为 Exes and Ohs
http://img2.58codes.com/2024/20117326Tj8pN3VXYr.png

连结如下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

虽然都可以解的出来,但如果追求精简导致后来的自己看不懂就不好了!


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章