3 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以Math.abs在拆分之前使用數(shù)字并將其轉(zhuǎn)換為字符串,然后使用 reduce 來(lái)計(jì)算總和。在從函數(shù)返回之前檢查輸入是小于還是大于 0 并相應(yīng)地采取措施
function sumDigits(num) {
// toString will convert to string so an array of string can be created
const sum = Math.abs(num).toString().split('').reduce((acc, curr) => {
// converting string to number before adding with previous digit
// else it will do string concatenation instead of mathematical addition
acc += +curr;
return acc
}, 0);
return num < 0 ? -1 * sum : sum;
}
let output = sumDigits(1148);
console.log(output); // --> 14
let outpu2t = sumDigits(-316);
console.log(outpu2t); // --> -10

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
我將重點(diǎn)關(guān)注 reduce 方法的部分。reduce Array 方法可以接收兩個(gè)參數(shù),第一個(gè)表示將“減少”數(shù)組的回調(diào),這個(gè)回調(diào)可以接收 4 個(gè)參數(shù):
電池
當(dāng)前值
當(dāng)前指數(shù)
大批
reduce 方法的第二個(gè)參數(shù)指示哪個(gè)值將啟動(dòng)回調(diào)的Acumulator參數(shù)。
一旦解釋說(shuō),在您看到的示例中,他表示累加器將從 0 值開始:
.reduce(<...>, 0)
然后,在 reduce 方法的第一次迭代中,當(dāng)前值的第一個(gè)值將是數(shù)組的 0 索引值。
num
如果我們考慮是的情況-316
,那么:
第一次迭代:回調(diào)變量將是:
a = 0
v = '-'
idx = 0
arr = ['-', '3', '1', '6']
該過(guò)程將是:
v === '-' //true, then:
v = 0
arr[idx+1] *= -1 //here, he are converting the value next to the sign to a negative value
a + +v //then, he add the v value to the acumulator with the corresponding sign.
第二次迭代:回調(diào)變量
a = 0
v = -3
idx = 1
arr = ['-', -3, '1', '6']
過(guò)程:
v === '-' //false, then:
a + +v //a = 0, v = -3. 0 + +(-3) = -3 (Number)
我認(rèn)為你可以貶低故事的其余部分。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
簡(jiǎn)短回答:arr[idx+1] *= -1直接將數(shù)組中的下一個(gè)成員操作為負(fù)整數(shù)。
您可以在 Javascript Playground 上嘗試以下代碼,以查看每個(gè)循環(huán)步驟的變量值,以便更好地理解:(這是您試圖理解的代碼的擴(kuò)展版本)
function sum(num) {
s = String(num)
.split('')
.reduce(function (a, v, idx, arr) {
console.log('a=', a, 'v=', v, 'idx=', idx, 'arr=', arr);
if (v === '-') {
v = 0;
arr[idx + 1] *= -1;
a += +v;
} else {
a += +v;
}
return a;
}, 0);
return s;
}
console.log(sum(1148));
console.log(sum(-316));
添加回答
舉報(bào)