如何使用自定义排序算法查找匹配元素并计算账户排名?
如何用自定义排序算法查找匹配元素并计算账户排名
我来帮你梳理这个需求的实现思路和优化细节——你要完成的核心是筛选出匹配的账户,再按照自定义权重规则计算排名并排序,你的基础代码框架已经很到位了,接下来我一步步拆解说明:
第一步:筛选匹配账户
你用$or条件筛选和发起请求账户有任一字段匹配的账户,同时排除自身,这部分逻辑没问题。注意如果用的是Mongoose这类ODM,find()返回的是查询对象,必须加await才能拿到实际的数组结果:
var account; // 假定为发起方法请求的账户 // 加上await获取实际匹配的账户数组 const allMatches = await Account.find({ $or: [ { argA: account.argA }, { argB: account.argB }, { argC: account.argC } ], _id: {$ne: account._id} });
第二步:自定义排名计算与排序
你的getRank函数已经定义了合理的权重规则:argB匹配加3分(权重最高),argA匹配加2分,argC匹配加1分。接下来我们给每个匹配账户计算排名,再按排名从高到低排序:
const getRank = (item) => { let rank = 0; if (item.argB === account.argB) { rank += 3; } if (item.argA === account.argA) { rank += 2; } if (item.argC === account.argC) { rank += 1; } return rank; }; // 给每个账户添加rank字段,同时转成普通对象(如果是Mongoose文档的话) const rankedAccounts = allMatches.map(item => ({ ...item.toObject(), rank: getRank(item) })).sort((a, b) => b.rank - a.rank); // 降序排序,让排名高的账户排在前面
进阶优化建议
如果匹配的账户数量很大,在内存中排序可能影响性能,推荐直接在数据库层面完成排名计算和排序,用MongoDB的聚合框架效率更高:
const rankedAccounts = await Account.aggregate([ // 第一步:筛选匹配的账户 { $match: { $or: [ { argA: account.argA }, { argB: account.argB }, { argC: account.argC } ], _id: {$ne: account._id} } }, // 第二步:计算排名 { $addFields: { rank: { $add: [ { $cond: [{ $eq: ["$argB", account.argB] }, 3, 0] }, { $cond: [{ $eq: ["$argA", account.argA] }, 2, 0] }, { $cond: [{ $eq: ["$argC", account.argC] }, 1, 0] } ] } } }, // 第三步:按排名降序排序 { $sort: { rank: -1 } } ]);
另外如果需要处理并列排名的情况,可以在排序时增加次要规则,比如按账户创建时间排序:
.sort((a, b) => { if (b.rank !== a.rank) { return b.rank - a.rank; } // 排名相同时,按创建时间降序排列 return new Date(b.createdAt) - new Date(a.createdAt); });
经过这些步骤,你就能得到一个按自定义规则排名排序的匹配账户列表,每个账户都带有计算好的rank字段,方便后续展示或业务逻辑使用。
内容的提问来源于stack exchange,提问作者iamkhush




