按排名分组用户数组:实现按rankId遍历同排名用户及所有排名
按rank字段分组用户数组的解决方案
嘿,这事儿我之前也碰到过,用JavaScript的reduce方法就能轻松搞定,完全匹配你想要的结构和后续遍历需求!
先看你的原数组:
var array = [ { user: '1xJs8A', rank: 1 }, { user: '1xJs8B', rank: 1 }, { user: '1xJs8C', rank: 2 }, ];
核心实现代码
用Array.prototype.reduce()来分组是最简洁的方式:
const groupedByRank = array.reduce((acc, currentUser) => { const rank = currentUser.rank; // 如果当前rank还没在累加器里,先初始化一个空数组 if (!acc[rank]) { acc[rank] = []; } // 把当前用户加入对应rank的数组 acc[rank].push(currentUser); return acc; }, {}); // 初始值设为空对象
处理后的结构
运行完上面的代码,groupedByRank的结构完全符合你的预期:
{ 1: [ { user: '1xJs8A', rank: 1 }, { user: '1xJs8B', rank: 1 } ], 2: [ { user: '1xJs8C', rank: 2 } ] }
怎么用这个结果
- 遍历同一排名下的所有用户:比如要遍历rank为1的用户,直接这样写就行:
groupedByRank[1].forEach(user => { console.log(`用户ID:${user.user},排名:${user.rank}`); }); - 遍历所有排名:如果要逐个处理每个排名下的用户组,可以用
Object.keys或者Object.values:// 遍历所有rankId,同时拿到对应的用户数组 Object.keys(groupedByRank).forEach(rankId => { console.log(`处理排名${rankId}的用户:`); groupedByRank[rankId].forEach(user => console.log(user)); }); // 或者直接遍历每个排名的用户数组 Object.values(groupedByRank).forEach(userArray => { userArray.forEach(user => console.log(user)); });
如果你确实需要数组形式(而不是对象),也可以把结果转成数组结构:
const groupedArray = Object.entries(groupedByRank).map(([rankId, users]) => ({ rankId: Number(rankId), // 把字符串转成数字类型 users: users }));
不过看你的需求,直接用对象结构更方便按rankId快速访问,完全满足array[rankId].forEach()的用法~
内容的提问来源于stack exchange,提问作者OrpheuZ
相关产品推荐
相关产品推荐

