3 回答

TA貢獻1828條經(jīng)驗 獲得超4個贊
這樣做很尷尬,因為它會遍歷整個陣列。如果我們做一個幼稚的實現(xiàn),你可以看到問題:.reduce
const arr = [5,6,0,7,8];
const sum = (arr,num) => arr.reduce((total, x)=>(num==x ? total : total+x), 0)
console.log(sum(arr, 0))
我們現(xiàn)在正確進行檢查 - 將在為零時返回(的值)。但是,結(jié)果是錯誤的,因為這只返回一次,但任何其他迭代它仍然是 。以下是描述該過程每個步驟的更多日志記錄的相同內(nèi)容:num==x
true
x
num
true
true
const arr = [5,6,0,7,8];
const sum = (arr,num) => arr.reduce((total, x)=> {
const boolCheck = num==x;
const result = boolCheck ? total : total+x;
console.log(
`total: ${total}
num: ${num}
x: ${x}
boolCheck: ${boolCheck}
result: ${result}`);
return result;
}, 0)
console.log(sum(arr, 0))
展開代碼段
因此,您需要添加一些在迭代之間持續(xù)存在的標(biāo)志,這樣它就不會丟失。
一種選擇是在回調(diào)中更改外部標(biāo)志:reduce
const arr = [5,6,0,7,8];
const sum = (arr,num) => {
let finished = false;
return arr.reduce((total, x) => {
if(x === num)
finished = true;
return finished ? total : total+x;
}, 0)
}
console.log(sum(arr, 0))
展開代碼段
或者,您可以將該標(biāo)志放在回調(diào)內(nèi)部,并在調(diào)用之間傳遞它。它最終以相同的方式工作,但使回調(diào)函數(shù)純凈。以一些非正統(tǒng)結(jié)構(gòu)為代價:reduce
const arr = [5,6,0,7,8];
const sum = (arr,num) => {
return arr.reduce(({total, finished}, x) => {
if(x === num)
finished = true;
total = finished ? total : total+x;
return {total, finished};
}, {total: 0, finished: false})
.total
}
console.log(sum(arr, 0))
展開代碼段
如果要使用但可以使用其他方法,則可以使用 Array#indexOf 來查找值的第一個實例,并使用 Array#切片包含任何值的數(shù)組,直到目標(biāo)值:reduce
const arr = [5,6,0,7,8];
const sum = (arr,num) => {
const endIndex = arr.indexOf(num);
return arr.slice(0, endIndex)
.reduce((total, x)=> total+x, 0)
}
console.log(sum(arr, 0))
展開代碼段
或作為一個鏈式表達式:
const arr = [5,6,0,7,8];
const sum = (arr,num) => arr
.slice(0, arr.indexOf(num))
.reduce((total, x)=> total+x, 0);
console.log(sum(arr, 0))
展開代碼段
其他庫可能有一個更接近你想要的或操作 - 它從一開始就給你一個數(shù)組到給定的值或條件。然后,您可以減少結(jié)果。takeUntiltakeWhile
下面是一個使用洛達什#takeWhile的示例
通過在此處使用鏈接,Lodash 將執(zhí)行惰性求值,因此它只會遍歷數(shù)組一次,而不是掃描一次以找到最終索引并再次遍歷數(shù)組以求和它。
const arr = [5,6,0,7,8];
const sum = (arr,num) => _(arr)
.takeWhile(x => x !== num)
.reduce((total, x)=>total+x, 0)
console.log(sum(arr, 0))
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
展開代碼段
請注意,如果您使用的是洛達什語,那么您也可以使用 _.sum()。我上面不是為了說明通用/的外觀。takeUntiltakeWhile
const arr = [5, 6, 0, 7, 8];
const sum = (arr, num) => _(arr)
.takeWhile(x => x !== num)
.sum()
console.log(sum(arr, 0))
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
展開代碼段

TA貢獻1876條經(jīng)驗 獲得超7個贊
由于您需要停止在數(shù)組中對值求和,因此這可能最簡單地使用循環(huán)來實現(xiàn):for
const arr = [5, 6, 0, 7, 8];
const num = 0;
let sum = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] == num) break;
sum += arr[i];
}
console.log(sum);
展開代碼段
如果要使用 ,則需要保留一個標(biāo)志,說明是否已看到該值,以便停止從數(shù)組中添加值:reducenum
const arr = [5, 6, 0, 7, 8];
const sum = (arr, num) => {
let seen = false;
return arr.reduce((c, v) => {
if (seen || v == num) {
seen = true;
return c;
}
return c + v;
}, 0);
}
console.log(sum(arr, 0));
console.log(sum(arr, 8));
添加回答
舉報