Как насчет итерации массива только один раз и построения результирующего массива?
arr.reduce((r, {rank, sid})=>(rank < 4 && (r[rank -1] = sid), r), [])
var arr = [{ sid: 387, rank: 2 }, { sid: 455, rank: 1 }, { sid: 364, rank: 4 }, { sid: 495, rank: 3 }],
top3 = arr.reduce((r, {rank, sid})=>(rank < 4 && (r[rank -1] = sid), r), []);
console.log(top3);
Примечание. Если вам нужны топ-3 в пределах высшего ранга 4
, а также вы знаете, что звания уникальны, вы можете использовать это.Если звания не уникальны, вы можете использовать r.splice(rank-1, 0, sid)
вместо r[rank-1] = sid
и slice
top 3 в конце.