javascript - 如何在对象数组的 shift() 之后使用 include()
问题描述
1 - 我有一个间隔循环通过一组玩家。
2 - 数组是一个对象数组。对象示例
{
id : "100",
fname : "tom",
lname : "smith",
position: 15,
team : "Giants"
};
3 - 数组有很多玩家,例如 player_list =[ {"id":"2218","avg":"60.9189","min":"1","max":"380","fname":"Patrick","lname":"Mahomes","position":"QB","team":"Chiefs"},{"id":"65","avg":"48.6216","min":"1","max":"194","fname":"Josh","lname":"Allen","position":"QB","team":"Bills"},{"id":"416","avg":"58.3784","min":"1","max":"213","fname":"Drew","lname":"Brees","position":"QB","team":"Saints"},{"id":"591","avg":"69.0270","min":"1","max":"231","fname":"Derek","lname":"Carr","position":"QB","team":"Raiders"},{"id":"840","avg":"61.1081","min":"1","max":"252","fname":"Sam","lname":"Darnold","position":"QB","team":"Jets"}]
4 - 在每个循环中,我首先使用 player_list.shift();
5 - 然后我将每个选定的玩家存储在另一个具有相同结构的对象数组中,称为 selected_players_list。这将包括从轮班中选择的每个玩家。
6 - 问题是以上只是玩家可以选择的方式之一,另一种方式是由用户手动选择,这也将被添加到 selected_players_list 中。
7 - 我想通过从players_list中删除玩家来自动删除任何手动选择的玩家
8 - 我有这个代码。
// loop through the players array
players_list.forEach(function(element) {
// check if the object exists in the other array
if(selected_players_list.includes(element)){
console.log('FOUND');
debugger;
// get the index of that object found
let found = total_result_player_data.findIndex(obj => obj.id === element.id);
if(found !== -1){
console.log('SPLICED -> ' + found);
// remove it from players list array
players_list.splice(found, 1);
console.log(players_list);
// debugger;
}
}
});
9 - 之后我想从数组中转移第一个玩家。
object_random_pick = players_list.shift();
10 - 但在第二个循环中,include 不再在 selected_players_list 数组中找到该玩家。
11 - 如果我改用它,它可以正常工作。
object_random_pick = players_list[0];
12 - 但是它反复使用相同的选择,这不是我想要的。我不希望任何玩家使用超过一次。
解决方案
不要使用.splice
或.shift
在循环内。在循环完成这项工作之前更改数组。如果你想从数组中删除一些元素,你必须使用.filter
此代码只是示例如何使用.filter
players_list = [ {"id":"2218","avg":"60.9189","min":"1","max":"380","fname":"Patrick","lname":"Mahomes","position":"QB","team":"Chiefs"},{"id":"65","avg":"48.6216","min":"1","max":"194","fname":"Josh","lname":"Allen","position":"QB","team":"Bills"},{"id":"416","avg":"58.3784","min":"1","max":"213","fname":"Drew","lname":"Brees","position":"QB","team":"Saints"},{"id":"591","avg":"69.0270","min":"1","max":"231","fname":"Derek","lname":"Carr","position":"QB","team":"Raiders"},{"id":"840","avg":"61.1081","min":"1","max":"252","fname":"Sam","lname":"Darnold","position":"QB","team":"Jets"}]
// loop through the players array
const chekedPlayers = players_list.filter(function(element) {
// check if the object exists in the other array
if (selected_players_list.includes(element)) {
console.log('FOUND');
//debugger;
// get the index of that object found
let found = total_result_player_data.findIndex(obj => obj.id === element.id);
if (found !== -1) {
console.log('SPLICED -> ' + found);
// remove it from players list array
return false; //
console.log(players_list);
// debugger;
}
return true;
}
});```
You can read doc of `.filter` and use how you need.
推荐阅读
- python - 我有一个带有时间索引的表。我只想从中选择一些不连续的日子我这样做了但没有工作
- ssl - 如何在 ESP8266 中验证 MQTT 连接的指纹?
- windows - Microsoft ASAN,使用 ASAN 编译 com dll 并注册它会产生错误
- node.js - $geoNear 需要 2d 或 2dsphere 索引,但是没有找到这个问题 getData api in node.js +monodb
- python - glob() 中的多个数组
- ios - Performant outline around UIImage edges
- java - 从不同类型的方法参数中提取特定字段的值
- webserver - Openlitespeed is serving files with no suffix as download instead of view
- postgresql - Dump PostgreSQL Database from Docker through SSH
- python - Split a string according to the sentence phrases contained in a list in Python