javascript 在我的网站上使用Node.js匹配用户

zpqajqem  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(138)

我目前正在开发一个"约会"网站,作为一个学校项目。我使用Node.js,Express,我的SQL和Pug(Jade)。
到目前为止,我的用户有个人资料页面,并在数据库中我有关于他们的以下信息:

  • 年龄
  • 性取向
  • 性别
  • 位置(纬度和经度、国家和确切城市)
  • 标签(最能定义标签的词语)

现在我有了所有这些,我的用户必须能够搜索:

  • 年龄
  • 位置和标签。

我应该按顺序渲染,第一个匹配应该总是位置最接近的。
如何对所有这些信息进行排序,以检查我的任何用户是否可以匹配一个或多个人?

w8f9ii69

w8f9ii691#

你可以遍历数据库中的所有用户并计算分数。分数是根据他们之间的距离来奖励的。最后,分数最高的人将是最佳匹配。
下面是一个随机生成数据的示例。
我假设

  • 每个人都对异性感兴趣
  • 纬度和经度是平面上的坐标,以便使用毕达哥拉斯定理计算距离
let data = [
  {
    'name': 'John Doe',
    'sex': 'male',
    'pos': [ 43.036871, -89.324967 ],
    'tags': [ 'general', 'basic' ]
  },
  {
    'name': 'Amy Schmidt',
    'sex': 'female',
    'pos': [ 39.48586, -121.387316 ],
    'tags': [ 'honest', 'uneven' ]
  },
  {
    'name': 'Robert Summers',
    'sex': 'male',
    'pos': [ 33.657366, -86.643871 ],
    'tags': [ 'efficient', 'psychotic' ]
  },
  {
    'name': 'Steven Walls',
    'sex': 'male',
    'pos': [ 43.484856, -83.849829 ],
    'tags': [ 'huge', 'grumpy' ]
  },
  {
    'name': 'Elizabeth Bateman',
    'sex': 'female',
    'pos': [ 38.886231, -99.306865 ],
    'tags': [ 'heavy', 'goofy' ]
  },
  {
    'name': 'Robert Galusha',
    'sex': 'male',
    'pos': [ 29.713645, -95.534338 ],
    'tags': [ 'vast', 'depressed' ]
  }
];

function search(person, tags) {
  let scores = { }, distances = { },
      lat = person.pos[0], lng = person.pos[1];
  
  data.filter(user => user.name !== person.name).forEach(user => {
    scores[user.name] = 0;
    scores[user.name] += user.tags.filter(tag => tags.indexOf(tag) > -1).length;
    scores[user.name] += user.sex !== person.sex ? 1 : 0;
    
    let dlat = Math.abs(lat - user.pos[0]), dlng = Math.abs(lng - user.pos[1]),
        distance = Math.sqrt(Math.pow(dlat, 2) + Math.pow(dlng, 2));
    
    distances[user.name] = distance;
  });
  
  // Needed to normalize the distances
  let maxDistance = Object.values(distances).sort((a, b) => b - a).shift();
  
  for(let name in distances)
    // Substract the normalized distance from 1, so: shorter distance = more points
    scores[name] += (1 - distances[name] / maxDistance);
  
  // Sort by score; the best match is the first element
  return Object.entries(scores).sort((a, b) => b[1] - a[1]);
}

console.log(search(data[0], [ 'honest', 'vast' ]))

如果您希望某些因素对总分的影响比其他因素更大,则可以将它们乘以一定的权重。

相关问题