Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查对象数组中某个范围的日期_Javascript_Arrays - Fatal编程技术网

Javascript 检查对象数组中某个范围的日期

Javascript 检查对象数组中某个范围的日期,javascript,arrays,Javascript,Arrays,我正在尝试创建一个函数,该函数接收一个数组并搜索,以查看员工是否在1990年后被雇用。如果是,函数将把它们的名称推送到一个新数组中。我在处理年龄范围的问题,所以我在过滤方面有点失误。我想出了一个相当狡猾的方法,将密钥对中的前4个值复制到第三个比较数组中。我的代码似乎按预期工作,但抛出了一条随机错误消息,我不知道如何调试它。是否有一种更有效的方法来实现相同的结果,而不会导致错误消息 const employeeList=[{ “id”:0, “姓名”:“员工1”, “年份”:“1991-1993

我正在尝试创建一个函数,该函数接收一个数组并搜索,以查看员工是否在1990年后被雇用。如果是,函数将把它们的名称推送到一个新数组中。我在处理年龄范围的问题,所以我在过滤方面有点失误。我想出了一个相当狡猾的方法,将密钥对中的前4个值复制到第三个比较数组中。我的代码似乎按预期工作,但抛出了一条随机错误消息,我不知道如何调试它。是否有一种更有效的方法来实现相同的结果,而不会导致错误消息

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对我最初代码行的解释。再次感谢您回答大家的问题!