刚接触JS的新手__学习reduce内做Object的计算
刚学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
虽然都可以解的出来,但如果追求精简导致后来的自己看不懂就不好了!
共同学习,写下你的评论
评论加载中...
作者其他优质文章