javascript - 通过保留具有匹配键的对象以及相邻对象来过滤对象数组
问题描述
我发现很难用标题来描述我遇到的问题,但是我希望一个例子会有所帮助。我有一个 javascript 对象数组,看起来像这样:
const myPlayer = "jim"
const myArray =
[
{"player":"bob", "points":11},
{"player":"joe", "points":15},
{"player":"nik", "points":18},
{"player":"tom", "points":21},
{"player":"jim", "points":25},
{"player":"ron", "points":26},
{"player":"tim", "points":32},
{"player":"jon", "points":35},
{"player":"len", "points":42},
{"player":"eva", "points":51}
];
我的数组按关键点对对象进行排序,我想过滤这个数组以保留(a)播放器键与myPlayer变量匹配的对象,以及(b)之前的 2 个对象和之后的 2 个对象匹配myPlayer变量。例如,在这种情况下,我想返回以下内容:
const filtArray =
[
{"player":"nik", "points":18},
{"player":"tom", "points":21},
{"player":"jim", "points":25},
{"player":"ron", "points":26},
{"player":"tim", "points":32}
];
...因为 nik 和 tom 是 jim 之前的两个对象,而 ron 和 tim 是 tim 之后的两个对象。每个对象的播放器键都有唯一的值,因此永远不会有两个对象具有相同的播放器键。
这个问题的最后一部分 - 我希望过滤后的数组始终包含 5 个对象。因此,如果myPlayer = "bob"
bob 是第一个对象中的玩家,我希望它简单地返回前 5 个对象,如下所示:
[
{"player":"bob", "points":11},
{"player":"joe", "points":15},
{"player":"nik", "points":18},
{"player":"tom", "points":21},
{"player":"jim", "points":25}
];
...如果 myPlayer = "joe",或者如果 myPlayer = "len" 或 "eva",则具有类似的输出。
对此的任何帮助表示赞赏,谢谢!
编辑:看起来我只是在我的代码中有一个小错误,它破坏了我的方法......有以下内容,它使用 findIndex 和 slice:
const index = myArray.findIndex(x => x.player === myPlayer);
filtArray = myArray.slice(index-2, index+2)
解决方案
您可以通过查找您正在寻找的玩家的索引来做到这一点,然后遍历数组并创建一个新的玩家列表,该列表具有该范围内的索引。
const myPlayer = "jim"
const myArray = [
{"player":"bob", "points":11},
{"player":"joe", "points":15},
{"player":"nik", "points":18},
{"player":"tom", "points":21},
{"player":"jim", "points":25},
{"player":"ron", "points":26},
{"player":"tim", "points":32},
{"player":"jon", "points":35},
{"player":"len", "points":42},
{"player":"eva", "points":51}
]
function indexOfPlayer(arr, player) {
return arr.map(i => i.player).indexOf(player)
}
function getItemWithSurrounding(arr, index, around) {
result = []
for (i = index - around; i <= index + around; i++) {
if (i >= 0 && i < arr.length) {
result.push(arr[i])
}
}
return result
}
playerIndex = indexOfPlayer(myArray, myPlayer)
players = getItemWithSurrounding(myArray, playerIndex, 2)
console.log(players)
输出:
[
{
"player": "nik",
"points": 18
},
{
"player": "tom",
"points": 21
},
{
"player": "jim",
"points": 25
},
{
"player": "ron",
"points": 26
},
{
"player": "tim",
"points": 32
}
]
推荐阅读
- linux - Plasmashell 桌面在短时间内冻结
- windows - Compress-Archive 命令不适用于另一个 npm 命令
- plotly-dash - 使用破折号情节时的烧瓶调试控制台
- javascript - 如何构建 esm 格式的 JS 文件
- pandas - 在图表的 x 轴上添加更多月份
- tomcat - HTTP 404 TOMCAT 战争部署 ANT
- reactjs - 重定向到另一个在 url 上传递 props id 参数的组件
- r - 比较r中的开始日期和结束日期
- sql - 无法在 Amazon Athena 中创建表
- docker - Gitlab 如何在 Docker 容器上注册运行器?