4 回答
TA贡献1834条经验 获得超8个赞
使用 4 个参数调用 reduce 回调:
arr.reduce(callback( accumulator, currentValue, index, array)
例子:
function join(arr, separator) {
if (arr.length === 0) { return(''); }
else {
return (
arr.reduce((accumulator, item, counter) =>
{
if (counter === arr.length - 1) {
return accumulator + item;
} else {
counter += 1;
return accumulator + item + separator;
}
},
'')
);
}
}
console.log(join(['a'], ','))
console.log(join(['a', 'b'], ','))
console.log(join(['a', 'b', 'c'], ''))
console.log(join(['a', 'b', 'c', 'd'], 'x'))
console.log(join(['a', 'b'], 'COMMA'))
console.log(join(['', '', ''], ','))
console.log(join([], ','))
您可以通过以下方式稍微缩短代码:
跳过空检查 - 如果数组为空,reduce 将返回初始值 (
''
)。使用模板字符串和三元组。如果它不是最后一项,则添加分隔符,如果是,则使用空字符串。
由于计数器 (
i
) 以 0 开头,您可以跳过第一项的分隔符(0 转换为false
)。这允许您跳过三元中的比较。
const join = (arr, separator) => arr.reduce((accumulator, item, i) =>
`${accumulator}${i ? separator : ''}${item}`
, '')
console.log(join(['a'], ','))
console.log(join(['a', 'b'], ','))
console.log(join(['a', 'b', 'c'], ''))
console.log(join(['a', 'b', 'c', 'd'], 'x'))
console.log(join(['a', 'b'], 'COMMA'))
console.log(join(['', '', ''], ','))
console.log(join([], ','))
更改顺序时的另一个想法(基于@JCFord 的arr[0]想法)是解构数组,获取第一个元素 ( first),如果它为空,则为其分配默认值。然后减少数组的其余部分,并用作first初始值。
const join = ([first = '', ...arr], separator) =>
arr.reduce((accumulator, item, i) => `${accumulator}${separator}${item}`, first)
console.log(join(['a'], ','))
console.log(join(['a', 'b'], ','))
console.log(join(['a', 'b', 'c'], ''))
console.log(join(['a', 'b', 'c', 'd'], 'x'))
console.log(join(['a', 'b'], 'COMMA'))
console.log(join(['', '', ''], ','))
console.log(join([], ','))
TA贡献1848条经验 获得超6个赞
正如其他人指出的那样,您可以在回调中使用索引和数组参数。
但还有另一种方法。您不必知道何时遇到最后一个数组元素。您已经知道第一个元素是什么,您可以直接使用它。
const join = (arr, sep=',') => arr.slice(1).reduce((acc, item) => acc + sep + item, arr[0]);
要进一步细化函数,请利用累加器很少使用的默认初始值。如果您没有将初始值传递给 reduce() 函数,则回调的第一次执行将获得数组的第一个和第二个元素。
const join = (arr, sep=',') => arr.reduce((acc, item) => acc + sep + item);
并无误地处理空数组......
const join = (arr, sep=',') => arr[0] ? arr.reduce((acc, item) => acc + sep + item) : '';
TA贡献1772条经验 获得超5个赞
我是这样做的。
假设您想用逗号分隔此数组,但以句点结尾。
let names = ['Amber', 'Bobby', 'Chris', 'Dennis', 'Edward'];
您可以使用第三个索引参数“i”并将其作为变量与要减少的数组的长度进行比较。
names.reduce((a, c, i) => {
const isLast = i == names.length -1;
return `${a}${c}` + (isLast ? '.' : ', ');
}, "")
结果: 'Amber, Bobby, Chris, Dennis, Edward.'
TA贡献1797条经验 获得超6个赞
您可以通过从 中删除初始值来简化当前函数reduce
。然后这将使用第一个元素作为初始值。您已经设置了一个保护子句来处理空数组,因此在这方面您应该没问题。
function join(arr, separator) {
if (arr.length == 0) return '';
return arr.reduce((accumulator, item) => accumulator + separator + item);
}
console.log(join(['a'], ','))
console.log(join(['a', 'b'], ','))
console.log(join(['a', 'b', 'c'], ''))
console.log(join(['a', 'b', 'c', 'd'], 'x'))
console.log(join(['a', 'b'], 'COMMA'))
console.log(join(['', '', ''], ','))
console.log(join([], ','))
join使用字符串数组的另一种简单方法reduce是根本不关心它产生的额外分隔符,并slice在减少数组后将其关闭。
function join(arr, separator) {
return arr.reduce((accumulator, item) => accumulator + separator + item, '')
.slice(separator.length);
}
console.log(join(['a'], ','))
console.log(join(['a', 'b'], ','))
console.log(join(['a', 'b', 'c'], ''))
console.log(join(['a', 'b', 'c', 'd'], 'x'))
console.log(join(['a', 'b'], 'COMMA'))
console.log(join(['', '', ''], ','))
console.log(join([], ','))
添加回答
举报