You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用自定义排序算法查找匹配元素并计算账户排名?

如何用自定义排序算法查找匹配元素并计算账户排名

我来帮你梳理这个需求的实现思路和优化细节——你要完成的核心是筛选出匹配的账户,再按照自定义权重规则计算排名并排序,你的基础代码框架已经很到位了,接下来我一步步拆解说明:

第一步:筛选匹配账户

你用$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

火山引擎 最新活动