[英]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.