javascript - 在具有一个条件的数组中搜索值
问题描述
我有一组玩家
所以我想创建一个函数来根据条件相互匹配
我开始思考(让队列中的第一个玩家)并尝试找到另一个符合条件的玩家
但后来我想:如果我不匹配第一个玩家,我永远不会移动到第二个匹配
基本上我需要从队列中获得 2 个满足条件的玩家,无论他们在队列中的位置如何
searching(id) {
const firstPLayer = this.players.find(p => p.id == id)
const { mmr } = firstPLayer
const secondPlayer = this.players.find((playerTwo) => playerTwo.mmr < (5 / 100) * mmr + mmr && playerTwo.mmr > mmr - ((5 / 100) * mmr) && playerTwo.id != firstPLayer.id);
if(!secondPlayer){
return null;
}
const matchedPlayers = [
firstPLayer,
secondPlayer
]
// remove matched players from this.players
this.removePlayers(matchedPlayers);
// return new Match with matched players
return matchedPlayers;
}
像这样,我有两个条件|:
playerTwo.mmr <(5/100) * mmr + mmr && playerTwo.mmr> mmr - ((5/100) * mmr)
但是如果我需要在不通过第一个玩家的情况下获取两个具有这种条件的玩家
解决方案
很难说为什么它不适合您(您确定在您的玩家列表中甚至有 2 个玩家与您的参数匹配吗?)..
您可以使用以下示例来帮助您,因为它似乎对我有用。
class Queue {
constructor() {
this.players = fetchPlayers();
}
removePlayers(playersToRemove) {
playersToRemove.forEach(player => {
const index = this.players.indexOf(player);
this.players.splice(index, 1);
})
}
getRandomPlayer() {
return this.players[Math.floor(Math.random() * this.players.length)];
}
calculateLessThanPercentage(player) {
return 5 / 100 * player.mmr + player.mmr
}
calculateGreaterThanPercentage(player) {
return player.mmr - 5 / 100 * player.mmr
}
searching() {
const firstPlayer = this.getRandomPlayer();
const secondPlayer = this.players.find(
playerTwo =>
playerTwo.mmr < this.calculateLessThanPercentage(firstPlayer) &&
playerTwo.mmr > this.calculateGreaterThanPercentage(firstPlayer) &&
playerTwo.id != firstPlayer.id
);
if (!secondPlayer) {
return null;
}
const matchedPlayers = [firstPlayer, secondPlayer];
this.removePlayers(matchedPlayers);
return matchedPlayers;
}
}
const ActiveQueue = new Queue();
const getPlayersButton = document.getElementById("getPlayers");
const playersResults = document.getElementById("players");
const allPlayers = document.getElementById("allPlayers");
getPlayersButton.addEventListener("click", () => {
getPlayers(ActiveQueue, playersResults, allPlayers)
});
// getPlayersButton click event handler
function getPlayers(queue, resultsElement, allPlayersElement) {
const searchResults = queue.searching();
resultsElement.innerHTML = JSON.stringify(searchResults, null, 2);
allPlayersElement.innerHTML = "Remaining Players: " + JSON.stringify(queue.players, null, 2);
}
// to get data
function fetchPlayers() {
return [
{
name: "Player One",
id: 1,
mmr: 500
},
{
name: "Player Two",
id: 2,
mmr: 800
},
{
name: "Player Three",
id: 3,
mmr: 810
},
{
name: "Player Four",
id: 4,
mmr: 815
},
{
name: "Player Five",
id: 5,
mmr: 510
},
{
name: "Player Six",
id: 6,
mmr: 540
},
{
name: "Player Seven",
id: 7,
mmr: 530
},
{
name: "Player Eight",
id: 8,
mmr: 520
}
];
}
button {
margin-top: 10px;
}
Click to get players (scroll all the way down to see remaining players)
<br />
<button id="getPlayers">Get Players</button>
<pre id="players"></pre>
<br />
<hr />
<pre id="allPlayers"></pre>
推荐阅读
- c# - 如何临时使用 Graphics.TranslateTransform
- heroku - Amazon S3 存储 Wagtail 媒体文件 - 仅 Heroku 上的服务器 500 错误
- angular - 为什么 [hidden] 在 forkJoin().subscribe() 之后不起作用?
- python - 在python中增加多行的一些列
- ios - IOS/Objective-C:代码中创建的tableview的无阻碍滚动(去除橡皮筋效果)
- python - 每 15 分钟更改一次日志文件名称而不覆盖
- java - 如何在地图中使用时间戳作为键
- python - 从给定格式中提取所需的名称
- node.js - Angular 6 文件上传
- linux - Python PATH .is_file() 将符号链接评估为文件