为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
JavaScript

刚学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题目上面啊(gdgjyc)!

上面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

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消