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

Javascript 在我的网站上使用Node.js匹配用户,javascript,mysql,node.js,Javascript,Mysql,Node.js,我目前正在开发一个“约会”网站作为学校项目。 我正在使用Node.js、Express、我的SQL和Pug(Jade)。 在过去的两天里,我一直在寻找答案,但我找不到任何答案,所以我来了。 到目前为止,我的用户有个人资料页面,在数据库中,我有以下关于他们的信息: -年龄 -性取向 -性 -位置(纬度和经度、国家和确切城市) -标记(定义它们的最佳单词) 现在我拥有了所有这些,我的用户必须能够通过以下方式进行搜索: -年龄 -位置和标签。 我应该按顺序渲染,第一个匹配应该始终是按位置最接近的匹配。

我目前正在开发一个“约会”网站作为学校项目。 我正在使用Node.js、Express、我的SQL和Pug(Jade)。 在过去的两天里,我一直在寻找答案,但我找不到任何答案,所以我来了。 到目前为止,我的用户有个人资料页面,在数据库中,我有以下关于他们的信息: -年龄 -性取向 -性 -位置(纬度和经度、国家和确切城市) -标记(定义它们的最佳单词)

现在我拥有了所有这些,我的用户必须能够通过以下方式进行搜索: -年龄 -位置和标签。 我应该按顺序渲染,第一个匹配应该始终是按位置最接近的匹配。 如何对所有这些信息进行排序,以检查我的任何用户是否可以匹配一个或多个用户


谢谢你的帮助,圣诞快乐

您可以遍历数据库中的所有用户并计算分数。积分将根据离目标的距离进行奖励。最后,得分最多的人将是最好的对手


下面是一些随机生成数据的示例。
我做了这个假设

  • 每个人都对异性感兴趣
  • 为了使用毕达哥拉斯定理计算距离,纬度和经度是平面上的坐标
let数据=[
{
“姓名”:“约翰·多伊”,
‘性别’:‘男性’,
‘pos’:[43.036871,-89.324967],
“标记”:[“常规”、“基本”]
},
{
“姓名”:“艾米·施密特”,
‘性别’:‘女性’,
‘pos’:[39.48586,-121.387316],
'标签':['诚实','不平']
},
{
“姓名”:“罗伯特·萨默斯”,
‘性别’:‘男性’,
‘pos’:[33.657366,-86.643871],
“标签”:[“高效”、“精神病患者”]
},
{
“姓名”:“史蒂文·沃尔斯”,
‘性别’:‘男性’,
‘pos’:[43.484856,-83.849829],
“标签”:[“巨大”、“暴躁”]
},
{
“姓名”:“伊丽莎白·贝特曼”,
‘性别’:‘女性’,
‘pos’:[38.886231,-99.306865],
“标签”:[“重”、“傻”]
},
{
“姓名”:“罗伯特·加鲁沙”,
‘性别’:‘男性’,
‘pos’:[29.713645,-95.534338],
“标记”:[“巨大”、“凹陷”]
}
];
功能搜索(人员、标签){
让分数={},距离={},
lat=人员位置[0],lng=人员位置[1];
data.filter(user=>user.name!==person.name).forEach(user=>{
分数[用户名]=0;
分数[user.name]+=user.tags.filter(tag=>tags.indexOf(tag)>-1).长度;
分数[用户名]+=user.sex!==person.sex?1:0;
设dlat=Math.abs(lat-user.pos[0]),dlng=Math.abs(lng-user.pos[1]),
距离=Math.sqrt(Math.pow(dlat,2)+Math.pow(dlng,2));
距离[用户名]=距离;
});
//需要标准化距离
设maxDistance=Object.values(distance).sort((a,b)=>b-a.shift();
for(以距离表示名称)
//从1减去标准化距离,因此:距离越短=点越多
分数[name]+=(1-距离[name]/maxDistance);
//按分数排序;最佳匹配是第一个元素
返回Object.entries(scores).sort((a,b)=>b[1]-a[1]);
}

console.log(搜索(数据[0],“诚实”,“广阔])
Wow非常感谢!这可能是一个完美的答案。你在使用承诺,我在这个项目中努力学习它们。而不是我要使用的毕达哥拉斯定理:但我想我会尝试两者。无论如何,谢谢你的帮助,如果我成功了,我会告诉你的。干杯。我不完全确定使用毕达哥拉斯定理是否在所有情况下都有效,所以你必须检查一下。我在哪里使用了承诺?哦,糟糕,我想LET应该与承诺一起使用。我不熟悉Javascript和Node.Js。不确定毕达哥拉斯定理,但我还是要试试!不,
let
只是一种声明变量的方法。它是在ES6中与
const
一起引入的,与
var
不同,两者都是块作用域。好的,我不知道,谢谢您提供的信息!