Javascript 检查对象数组中某个范围的日期
我正在尝试创建一个函数,该函数接收一个数组并搜索,以查看员工是否在1990年后被雇用。如果是,函数将把它们的名称推送到一个新数组中。我在处理年龄范围的问题,所以我在过滤方面有点失误。我想出了一个相当狡猾的方法,将密钥对中的前4个值复制到第三个比较数组中。我的代码似乎按预期工作,但抛出了一条随机错误消息,我不知道如何调试它。是否有一种更有效的方法来实现相同的结果,而不会导致错误消息Javascript 检查对象数组中某个范围的日期,javascript,arrays,Javascript,Arrays,我正在尝试创建一个函数,该函数接收一个数组并搜索,以查看员工是否在1990年后被雇用。如果是,函数将把它们的名称推送到一个新数组中。我在处理年龄范围的问题,所以我在过滤方面有点失误。我想出了一个相当狡猾的方法,将密钥对中的前4个值复制到第三个比较数组中。我的代码似乎按预期工作,但抛出了一条随机错误消息,我不知道如何调试它。是否有一种更有效的方法来实现相同的结果,而不会导致错误消息 const employeeList=[{ “id”:0, “姓名”:“员工1”, “年份”:“1991-1993
const employeeList=[{
“id”:0,
“姓名”:“员工1”,
“年份”:“1991-1993年”,
“国籍”:“亚洲人”
},
{
“id”:1,
“姓名”:“员工2”,
“年份”:“1988年至2020年”,
“国籍”:“西班牙裔”
},
{
“id”:2,
“姓名”:“员工3”,
“年份”:“1990-2010年”,
“国籍”:“太平洋岛民”
},
{
“id”:3,
“姓名”:“员工4”,
“年份”:“1971年至1999年”,
“国籍”:“亚洲人”
}
]
函数getEmployees(数组){
设newArray=newArray();
让compareArray=新数组();
对于(变量i=0,len=array.length;i1990){
newArray.push.call(数组[j].name);
}
}
返回(newArray);
}
getEmployees(员工列表)代码>您的问题在于对的使用。.call()
的第一个参数指定此
绑定将用于您正在使用的.call()
方法。在本例中,将this设置为字符串数组[j]。name
。当.push()
运行时,它将尝试更新要推送到的数组的.length
属性(因此此的.length属性)。当您将this
设置为字符串时,当.push()尝试更新字符串的.length
属性时,它将抛出一个错误,因为字符串的.length
属性是只读的,这意味着您无法为其分配新值
相反,您希望this
引用新数组,而不是字符串。相反,您可以使用:
.call(newArray, array[j].name)
或者,只需使用:
newArray.push(array[j].name);
const employeeList=[{
“id”:0,
“姓名”:“员工1”,
“年份”:“1991-1993年”,
“国籍”:“亚洲人”
},
{
“id”:1,
“姓名”:“员工2”,
“年份”:“1988年至2020年”,
“国籍”:“西班牙裔”
},
{
“id”:2,
“姓名”:“员工3”,
“年份”:“1990-2010年”,
“国籍”:“太平洋岛民”
},
{
“id”:3,
“姓名”:“员工4”,
“年份”:“1971年至1999年”,
“国籍”:“亚洲人”
}
]
函数getEmployees(数组){
设newArray=[];
让compararray=[];
对于(变量i=0,len=array.length;i1990){
newArray.push(数组[j].name);//更改为仅为`.push()`而不是`.call()`
}
}
返回新数组;
}
控制台日志(getEmployees(employeeList))代码>我宁愿做以下同样的事情:
employeeList.filter((employee) =>
Number(employee["years"].substr(0, 4)) > 1990)
.map(employee => employee["name"])
我个人认为它更具可读性。我认为您可以不使用中间数组:
employeeList.filter(e => parseInt(e.years.replace(/ .*$/, '')) > 1990).map(e => e.name)
filter将返回一个仅包含与表达式匹配的值的数组,map将返回一个新数组,其中每个元素都由表达式的结果替换。这可以更简单地使用数组#filter
来查找1990年之后开始工作的员工和数组#map
来完成仅获取名称
const employeeList=[{
“id”:0,
“姓名”:“员工1”,
“年份”:“1991-1993年”,
“国籍”:“亚洲人”
},
{
“id”:1,
“姓名”:“员工2”,
“年份”:“1988年至2020年”,
“国籍”:“西班牙裔”
},
{
“id”:2,
“姓名”:“员工3”,
“年份”:“1990-2010年”,
“国籍”:“太平洋岛民”
},
{
“id”:3,
“姓名”:“员工4”,
“年份”:“1971年至1999年”,
“国籍”:“亚洲人”
}
];
const res=employeeList.filter({years})=>+years.slice(0,4)>1990.map({name})=>name);
控制台日志(res)代码>谢谢大家的回复。我试图提高每个人的投票率,但由于我是新来的,所以提高投票率并不公开。我刚刚学习了.map、.filter和.reduce。这肯定会有助于完成这项任务。我真的很喜欢Nick Parsons对我最初代码行的解释。再次感谢您回答大家的问题!