簡體   English   中英

如何將數組傳遞給函數而不改變原始數組?

[英]How to pass an array to a function without mutating the original array?

我正在一個更大的函數中處理一個輔助函數。

我有一個團隊對象數組(每個團隊看起來像這樣 {team: unique number of the team , points:0,goalDiff:0,goalsFor:0})作為我函數的第一個參數,我有一個游戲結果數組作為第二個參數(每場比賽看起來像這樣[主隊裁判號碼,客隊裁判號碼,主隊進球數,客隊進球數])。

我的函數查看第二個數組中的每場比賽,並為獲勝的球隊分配 2 分,為失敗的球隊分配 0 分。 在平局的情況下,每隊分配 1 分。 函數還計算每支球隊的進球數。

    let computeGames = (arr, games) => {

  
    games.forEach((game) => {
      
      let homeTeamIndex = arr.findIndex(team => team.team === game[0])
      let awayTeamIndex = arr.findIndex(team => team.team === game[1])
      let homeTeam = arr[homeTeamIndex]
      let awayTeam = arr[awayTeamIndex]
    
      
      game[2] > game[3]
        ? (homeTeam.points += 2)
        : game[2] === game[3]
        ? ((homeTeam.points += 1), (awayTeam.points += 1))
        : (awayTeam.points += 2);
      homeTeam.goalsFor += game[2];
      awayTeam.goalsFor += game[3];
      homeTeam.goalDiff += game[2] - game[3];
      awayTeam.goalDiff += game[3] - game[2];
    });

  return arr
    
  };

我的代碼按預期計算積分和目標,但我的問題是,當我執行類似下面的代碼時,積分會在我的團隊數組和 doNotMutate 數組中計算。 我不明白為什么團隊會發生變異,因為它是傳遞給函數的團隊副本,而不是團隊數組本身。 如果有人能解釋一下,我在這里真的很困惑。

干杯

const teams = createTeams(number) // this is a helper function to generate my teams with all values = 0
let doNotMutate = [...teams]

doNotMutate= computeGames(doNotMutate,games)
  
  console.log(teams, doNotMutate)

執行[...teams]不會復制存儲在數組中的對象。 數組的每一項都被簡單地復制到一個新數組中。 在您的情況下,每個項目都是一個對象,這意味着新數組將包含完全相同的對象(如果有幫助,可以將它們視為“對相同值的引用” )。

你可以觀察到這一點:

teams[0] === doNotMutate[0] // true! (we don't want this)

您需要遍歷數組並將每個項目映射到其自身的副本 ( {...obj} )。 像這樣的東西:

const doNotMutate = [...teams].map(game => ({...game}));

或者,探索深度克隆實現,例如lodash 的.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM