第一个练习
● 计算所有账户的存款总额
const bankDepositSum = accounts //定义一个变量
.flatMap(acc => acc.movements) //使用flatmap将所有的存款提取,然后组成一个新的数组
.filter(mov => mov > 0) //使用filter方法提取所有的正值
.reduce((sum, cur) => sum + cur,0); //将所有的正值进行累加
console.log(bankDepositSum);
第二个练习
● 计算所有账号中大于1000存款的有多少笔?
● 第一种方法
const numDeposit1000 = accounts //定义一个变量
.flatMap(acc => acc.movements) //使用flatmap获取到我们的存取款数组
.filter(mov => mov >= 1000).length; //过滤大于等于1000的存款,计算长度
console.log(numDeposit1000);
● 第二种方法
const numDeposit1000 = accounts //定义一个变量
.flatMap(acc => acc.movements) //使用flatmap获取到我们的存取款数组
.reduce((count, cur) => (cur >= 1000 ? count + 1 : count), 0); //使用reduce方法,使用三元运算符来判断此时数组是否大于等于1000,如果是的的话就将count累加
console.log(numDeposit1000);
可以将计数的代码改进一下
const numDeposit1000 = accounts
.flatMap(acc => acc.movements)
.reduce((count, cur) => (cur >= 1000 ? ++count : count), 0);
console.log(numDeposit1000);
注: ++count不要写成了count++,很好理解,++count是先运算后赋值,而count++先赋值后运算!
第三个练习
● 分别计算存款和取款之和
const sums = accounts //定义一个变量
.flatMap(acc => acc.movements) //使用flatmap获取到我们的存取款数组
.reduce( //使用reduce来判断当前值是否大于0,如果大于0的话将现在的值累计至deposits中,否则累加到withdrawals
(sums, cur) => {
cur > 0 ? (sums.deposits += cur) : (sums.withdrawals += cur);
return sums; //这里一定要返回我们需要的值,默认情况下没有返回值,只是计算而已
},
{ deposits: 0, withdrawals: 0 } //先将这两个值归零
);
console.log(sums);
接着我们来改进一下上面的代码
c
onst { deposits, withdrawals } = accounts
.flatMap(acc => acc.movements)
.reduce(
(sums, cur) => {
// cur > 0 ? (sums.deposits += cur) : (sums.withdrawals += cur);
sums[cur > 0 ? 'deposits' : 'withdrawals'] += cur;
return sums;
},
{ deposits: 0, withdrawals: 0 }
);
console.log(deposits, withdrawals);
//使用了对象解构和动态属性名。
对象解构:使用对象解构可以直接从数组的结果中提取需要的属性值,而无需再去访问对象属性。这使得代码更加简洁清晰。
动态属性名:在对象字面量中使用方括号和变量来创建动态属性名。这种写法可以根据条件动态地设置对象的属性名,避免了重复的代码。
去除多余的返回语句:由于对象在 JavaScript 中是引用类型,因此在 reduce 函数中直接修改 sums 对象的属性值即可,无需返回 sums。这样可以减少代码的冗余性。
第四个练习
● 将一段话的首字母转换为大写字母,其他都是小写,但是请注意,有一些字符不需要进行转换
const convertTitleCase = function (title) { //定义一个变量
const expecitons = ['a', 'an', 'the', 'but', 'or', 'on', 'in', 'with']; //将不需要进行大写转换的存入一个对象中
const titleCase = title
.toLowerCase() //首先将字符串全部变成小写
.split(' ') //通过空格来分割组成一个数组
.map(word => //通过map和includes方法来判断字符串是否再排除列表中,如果在不转换,如果不在就转换
expecitons.includes(word) ? word : word[0].toUpperCase() + word.slice(1)
)
.join(' '); //将转换后的数组组成一个字符串
return titleCase;
};
console.log(convertTitleCase('this is a nice title'));
console.log(convertTitleCase('this is a LONG title but not too long'));
console.log(convertTitleCase('and here is another title with an EXAMPLE'));