首页 > 解决方案 > 通过保留具有匹配键的对象以及相邻对象来过滤对象数组

问题描述

我发现很难用标题来描述我遇到的问题,但是我希望一个例子会有所帮助。我有一个 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)

标签: javascriptfilter

解决方案


您可以通过查找您正在寻找的玩家的索引来做到这一点,然后遍历数组并创建一个新的玩家列表,该列表具有该范围内的索引。

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
  }
]

推荐阅读