第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 reduce 方法對數(shù)組元素進行計數(shù),直到出現(xiàn)特定值,不會給出正確的輸出

通過 reduce 方法對數(shù)組元素進行計數(shù),直到出現(xiàn)特定值,不會給出正確的輸出

哈士奇WWW 2022-09-11 20:20:34
const arr = [5,6,0,7,8];const sum = (arr,num) => arr.reduce((total)=>(num==0 ? total : total+num), 0) console.log(sum(arr, 0))請檢查我如何使它工作。做了一些錯誤,但不知道到底是什么。輸出是函數(shù)而不是結(jié)果。
查看完整描述

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==xtruexnumtruetrue

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>

展開代碼段


查看完整回答
反對 回復(fù) 2022-09-11
?
幕布斯6054654

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));


查看完整回答
反對 回復(fù) 2022-09-11
?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

您需要括號來執(zhí)行該函數(shù)()

sum(arr, 0)

如果不使用括號,則將對函數(shù)的引用存儲在變量中


查看完整回答
反對 回復(fù) 2022-09-11
  • 3 回答
  • 0 關(guān)注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號