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([], ','))
添加回答
舉報