Javascript 带有ageDifference的if语句未正确计算最接近的年龄
当我试图找到与索尼娅·索托马约尔年龄最接近的人时,有些事情不对劲。有人能发现我的错误吗Javascript 带有ageDifference的if语句未正确计算最接近的年龄,javascript,Javascript,当我试图找到与索尼娅·索托马约尔年龄最接近的人时,有些事情不对劲。有人能发现我的错误吗 var notablePeople={ “猫王”:新的日期(1935,0,8), “索尼娅·索托马约尔”:新的日期(1954年5月25日), “富兰克林·D·罗斯福”:新的日期(1882年0月30日), “本·卡森”:新的日期(1951年8月18日), “罗杰·斯塔巴赫”:新的日期(1942年1月5日), 《史蒂夫·乔布斯》:新的日期(1955年1月24日), “阿尔伯特·爱因斯坦”:新的日期(1879年2
var notablePeople={
“猫王”:新的日期(1935,0,8),
“索尼娅·索托马约尔”:新的日期(1954年5月25日),
“富兰克林·D·罗斯福”:新的日期(1882年0月30日),
“本·卡森”:新的日期(1951年8月18日),
“罗杰·斯塔巴赫”:新的日期(1942年1月5日),
《史蒂夫·乔布斯》:新的日期(1955年1月24日),
“阿尔伯特·爱因斯坦”:新的日期(1879年2月14日),
“艾萨克·阿西莫夫”:新的日期(1919年9月4日),
“贾达·平克特·史密斯”:新日期(1971年8月18日),
“格雷斯·霍珀”:新的日期(1906年11月9日),
“贾里德·尼古拉斯”:新的日期(1995年5月16日)
};
//找出与索尼娅·索托马约尔年龄最接近的人
var sonyaAge=notablePeople[“Sonya Sotomayor”].getTime();
var年龄差=无穷大;
var personClosest=“”;
对于(以名人身份出现的人){
//看看这个人的年龄差距是否更近
if(person!=“Sonya Sotomayor”&&Math.abs(notablePeople[person].getTime()-sonyaAge)var notablePeople={
“猫王”:新的日期(1935,0,8),
“索尼娅·索托马约尔”:新的日期(1954年5月25日),
“富兰克林·D·罗斯福”:新的日期(1882年0月30日),
“本·卡森”:新的日期(1951年8月18日),
“罗杰·斯塔巴赫”:新的日期(1942年1月5日),
《史蒂夫·乔布斯》:新的日期(1955年1月24日),
“阿尔伯特·爱因斯坦”:新的日期(1879年2月14日),
“艾萨克·阿西莫夫”:新的日期(1919年9月4日),
“贾达·平克特·史密斯”:新日期(1971年8月18日),
“格雷斯·霍珀”:新的日期(1906年11月9日),
“贾里德·尼古拉斯”:新的日期(1995年5月16日)
};
//找出与索尼娅·索托马约尔年龄最接近的人
var sonyaAge=notablePeople[“Sonya Sotomayor”].getTime();
var年龄差=无穷大;
var personClosest=“”;
对于(以名人身份出现的人){
//看看这个人的年龄差距是否更近
log(person,Math.abs(notablePeople[person].getTime()-sonyaAge)/1000/60/60/24/365);
if(person!=“sonyasotomayor”&&(Math.abs(notablePeople[person].getTime()-sonyaAge)
//你用错误的格式比较年龄,你用的是person而不是personest。我会用personest来解决这个问题。其目的是获取一个数组并将其缩减为单个值。在本例中,我选择将其简化为包含名称和年龄差异的对象
var notablePeople={
“猫王”:新的日期(1935,0,8),
“索尼娅·索托马约尔”:新的日期(1954年5月25日),
“富兰克林·D·罗斯福”:新的日期(1882年0月30日),
“本·卡森”:新的日期(1951年8月18日),
“罗杰·斯塔巴赫”:新的日期(1942年1月5日),
《史蒂夫·乔布斯》:新的日期(1955年1月24日),
“阿尔伯特·爱因斯坦”:新的日期(1879年2月14日),
“艾萨克·阿西莫夫”:新的日期(1919年9月4日),
“贾达·平克特·史密斯”:新日期(1971年8月18日),
“格雷斯·霍珀”:新的日期(1906年11月9日),
“贾里德·尼古拉斯”:新的日期(1995年5月16日)
};
//找出与索尼娅·索托马约尔年龄最接近的人
var sonya=“sonya Sotomayor”;
var sonyaAge=notablePeople[sonya].valueOf();
var年龄差=无穷大;
var personClosest=“”;
//Object.keys返回属性名数组(人员)
var personAge=Object.keys(notablePeople)
//过滤掉索尼娅
.filter(key=>key!==sonya)
//过完剩下的
.reduce((agg,cur)=>{
//agg是“聚合值”;包含名称和年龄差异的对象
//从最后一个循环。
//cur是我们正在查看其信息的人的姓名
//计算它们之间的差值。差值为正。
const diff=Math.abs(notablePeople[cur].valueOf()-sonyaAge);
//返回一个有差异的对象(如果它小于前面的任何一个)
//以及当前人员的姓名(同样,如果差异小于之前的任何差异)
返回{
年龄差异:diff log(`最近的年龄差异是${personAge.person}与${personAge.ageDifference}年差异。`)代码>我解决了这个问题,方法是将其基本化(简化),删除长除法,并使用普通数字检查例程。这个问题很快就暴露出来了;你如何测试新的ageDiff是无效的
基础套管是一种非常有用的技术。这可能不是真正的“技术”基础套管,但概念是相同的;尽可能降低复杂性,您通常可以更轻松地找到正在发生的事情
看看下面的图片。它呈现正确的结果(Staubach)。替换回你的逻辑(我自己,我会省略长除法,直到你已经知道这个人是谁,如果你不确定你有合适的人,没有理由运行这个逻辑),你应该能够继续前进
const notablePeople = {
"Elvis Presley": 50,
"Sonya Sotomayor": 30,
"Franklin D. Roosevelt": 10,
"Roger Staubach": 20,
"Ben Carson": 45,
};
console.log ( getPerson () );
function getPerson () {
let ageDiff = Infinity;
let finalPerson = null;
const sonyaAge = notablePeople["Sonya Sotomayor"];
for (person in notablePeople) {
if (person !== "Sonya Sotomayor") {
const testAgeDiff = Math.abs(notablePeople[person] - sonyaAge);
if ( testAgeDiff < ageDiff ) {
ageDiff = testAgeDiff;
finalPerson = person;
}
}
}
return finalPerson;
}
const notablePeople={
“猫王”:50岁,
“索尼娅·索托马约尔”:30岁,
“富兰克林·D·罗斯福”:10,
“罗杰·斯塔巴赫”:20岁,
“本·卡森”:45岁,
};
console.log(getPerson());
函数getPerson(){
设ageDiff=无穷大;
设finalPerson=null;
const sonyaAge=知名人士[“Sonya Sotomayor”];
对于(以名人身份出现的人){
我
const notablePeople = {
"Elvis Presley": 50,
"Sonya Sotomayor": 30,
"Franklin D. Roosevelt": 10,
"Roger Staubach": 20,
"Ben Carson": 45,
};
console.log ( getPerson () );
function getPerson () {
let ageDiff = Infinity;
let finalPerson = null;
const sonyaAge = notablePeople["Sonya Sotomayor"];
for (person in notablePeople) {
if (person !== "Sonya Sotomayor") {
const testAgeDiff = Math.abs(notablePeople[person] - sonyaAge);
if ( testAgeDiff < ageDiff ) {
ageDiff = testAgeDiff;
finalPerson = person;
}
}
}
return finalPerson;
}