使用 .push 更新对象以添加新元素

Updating Objects To Add New Element With .push

在下面的代码片段中,目标是通过检查 .name 属性

来检查 addedPlayer 是否已经存在于 players

if addedPlayer 已经在 players : 给玩家一分

else 通过在 addedPlayer 中添加起点

来更新 players
let players = []

let addedPlayer = { 

   name: /* The Given Name To Check in players */ ,
   points: 1

}

function addPlayer(playerList, playerToAdd){

   const existingPlayers = playerList.map((playerToAdd) => playerToAdd.name);

   if(existingPlayers.includes(playerToAdd.name)){

       playerToAdd.points++

   } else {

      playerList.push(playerToAdd)

   }
}

addPlayer(players, addedPlayer)

console.log(players)

问题是 players 只有 returns addedPlayer。我的目标是 players 将存储每个新玩家并相应地添加积分

您可以通过检查 player.name 来查找给定数组中是否已经存在 newPlayer 来实现这一点,然后如果 newPlayer 已经存在则有条件地递增 player.point 否则添加newPlayer 到数组。

这是一个例子。

let players = [
    {
        name: 'Player1',
        point: 1
    },
    {
        name: 'Player2',
        point: 2
    }
]

let newPlayer = { 
   name: 'Player2',
   points: 1
}

function addPlayer(playerlist, newPlayer) {
    // idx will be -1 if a player does not exist in playerlist by the name
    const idx = playerlist.findIndex(p => p.name === newPlayer.name);

    if (idx === -1) {
        // if you want to mutate the original array you can use playerlist.push(newPlayer) then return immediately from the function and omit the next return line
        return [...playerlist, newPlayer]
    }
    
    // increment player.point if newPlayer already exists

    playerlist[idx] = {...playerlist[idx], point: playerlist[idx].point + 1}
    // if you want to mutate the original array then omit the next return line
    return [...playerlist]
}

// because newPlayer already exists in players array by name calling the function addPlayer will increment player.point in players array where player.name is 'Player2'
console.log(addPlayer(players, newPlayer))

// calling the function with a player that does not exist in the array
let anotherPlayer = { name: 'Player3', point: 0 };

// anotherPlayer will be added to the returned array
console.log(addPlayer(players, anotherPlayer))

P.S。 - 当前的解决方案将在每次调用 addPlayer 函数时 return 一个新数组,如果您的用例需要您改变数组,您可以使用 Array.prototype.push 并省略 return s 来自函数。我在代码段中包含了一些评论以获取更多详细信息。

始终初始化我们的变量被认为是一种很好的做法。我刚刚为我们的用户对象创建了一个名称变量。

每次您 运行 addPlayer 现在都会将新玩家推送到列表中。

let players = []
var name = "";

let addedPlayer = {

    name: name,
    points: 1

}

function addPlayer(playerList, playerToAdd) {

    const existingPlayers = playerList.map((playerToAdd) => playerToAdd.name);

    if (existingPlayers.includes(playerToAdd.name)) {

        playerToAdd.points++

    } else {

        playerList.push(playerToAdd)

    }
}

addPlayer(players, addedPlayer)

console.log(players)