【问题标题】:Updating Objects To Add New Element With .push使用 .push 更新对象以添加新元素
【发布时间】:2020-05-28 20:20:47
【问题描述】:

在下面的 sn-p 中,目标是通过检查 .name 属性来检查 addedPlayer 是否已存在于 players

如果addedPlayer已经在players中:给玩家一分

else 更新players,在addedPlayer 中添加一个起点

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 只返回addedPlayer。我的目标是players 将存储每个新玩家并相应地增加积分

【问题讨论】:

  • 你的代码工作得很好,除了部分,它应该增加点,因为你增加playerToAdd.points,你永远不会存储到你的playerList

标签: javascript object push


【解决方案1】:

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

p>

这是一个例子。

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

附: - 当前解决方案将在每次调用 addPlayer 函数时返回一个新数组,如果您的用例要求您更改可以使用 Array.prototype.push 的数组并忽略函数的返回。我在 sn-p 中包含了一些 cmets 以获得更多详细信息。

【讨论】:

  • 知道了!感谢您的帮助
  • 我很高兴它有帮助。
【解决方案2】:

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

现在每次运行 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 2010-10-18
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2018-01-06
    • 2012-10-17
    • 2016-02-23
    相关资源
    最近更新 更多