题目: Format a string of names like ‘Bart, Lisa & Maggie’
来源:https://www.codewars.com/kata/format-a-string-of-names-like-bart-lisa-and-maggie/javascript
描述:
+ Given:an array containing hashes of names
+ Return:a string formatted as a list of names separated by commas except for the last two names, which should be separated by an ampersand.
分析:
很简单的字符串拼接的题目,主要考察对数组的操作,给你一个包含很多名字的对象数组,讲这些名字按一定的规律拼接成字符串,方法有很多中,但是要编写的更为clever。
1. 方法一:
首先考虑使用最简单的array.map()
方法来进行数组的遍历,使用if-else
来进行条件判断,将数组的每一项进行相应的格式化组成新的数组,最后将新的数组使用join()
方法拼接起来。
function list(names) {
var len = names.length
var arr = names.map(function(val, index) {
if(index < len-2) {
return val.name + ', '
} else if (index === len-2) {
return val.name + ' & '
} else {
return val.name
}
})
return arr.join('');
}
方法太笨,不太好。
2. 方法二:
使用array.reduce()
方法来进行数组的遍历,使用? :
三目操作符来进行条件判断,利用array.slice()
方法截断数组,将数组的第零项作为参数传给reduce()
方法作为第一个prev。
function list(names){
return names.length ? names.slice(1).reduce((pre, current, index) => {
return pre + (index<names.length-2 ? ', ' + current.name : ' & ' + current.name)
}, names[0].name) : ''
}
还是不够clever,这个方法有个问题,在第二行return语句上加上了一个对数组长度的判断,因为如果不加这个判断,输入的数组为空的话,就会因为使用了names[0].name
语句报错。
3. 方法三
同样使用reduce()
方法来进行遍历与组合,但是不再使用slice()
方法截断数组,直接采用三目运算符的嵌套来进行条件判断,clever!
function list2(names) {
return names.reduce((prev, curr, i) => {
return prev + curr + (i<names.length-2) ? ', ' : i===names.length-2 ? ' & ' : ''
}, '')
}
利用三目运算符的嵌套实现多重判断!!,这个要学会使用。