Javascript JS将元素推送到数组中,如果它不存在,则重新计算数组
我正在使用下面的方法Javascript JS将元素推送到数组中,如果它不存在,则重新计算数组,javascript,arrays,ecmascript-6,iteration,Javascript,Arrays,Ecmascript 6,Iteration,我正在使用下面的方法 const employeesByDepartment = {}; employeesArray.forEach((employee) => { if (!(employeesByDepartment[employee.department])) { employeesByDepartment[employee.department] = {}; employeesByDepartment[employee.departme
const employeesByDepartment = {};
employeesArray.forEach((employee) => {
if (!(employeesByDepartment[employee.department])) {
employeesByDepartment[employee.department] = {};
employeesByDepartment[employee.department].managers = [];
employeesByDepartment[employee.department].members = [];
}
let thisManagerAlreadyAdded = false;
// PROBLEM ON NEXT LINE
employeesByDepartment[employee.department].managers.forEach((manager) => {
if (manager.id === employee.manager) {
thisManagerAlreadyAdded = true;
}
});
if (thisManagerAlreadyAdded === false) {
employeesByDepartment[employee.department].managers
.push(ReturnOneUser(employee.manager));
}
});
问题:在数组中找不到任何管理器,因此它们都已添加。也就是说,永远不会到达该块中的表达式
employeesByDepartment[employee.department].managers.forEach((manager)
在我的测试中,该数组的长度始终为0
。因此,我假设JS解释器(Node.JS)不会在每次执行forEach
时重新检查数组。到目前为止,我还尝试了数组indexOf方法和for循环,但是在数组中找不到管理器
那么,如何添加一个未找到的管理器,然后为下一个管理器重新评估阵列?移动该条件不会解决您的问题吗
const employeesByDepartment = {};
employeesArray.forEach((employee) => {
let thisManagerAlreadyAdded = false;
if (!(employeesByDepartment[employee.department])) {
employeesByDepartment[employee.department] = {};
employeesByDepartment[employee.department].managers = [];
employeesByDepartment[employee.department].members = [];
}
if (!thisManagerAlreadyAdded) {
employeesByDepartment[employee.department].managers
.push(ReturnOneUser(employee.manager));
}
// MOVE IT HERE
employeesByDepartment[employee.department].managers.forEach((manager) => {
if (manager.id === employee.manager) {
thisManagerAlreadyAdded = true;
}
});
});
您可以使用.find检查用户是否已存在于特定数组中
即,如果managers
是当前数组,则使用.find
将始终再次遍历整个数组并检查结果。这考虑到manager.id
和employee.manager
都是字符串
!!managers.find(manager => manager.id === employee.manager);
如果您使用
在开始时,它将返回一个布尔值。您不需要使用任何ThisManagerReadyAdded
样式代码
所以你可以简单地用这个
const managers = employeesByDepartment[employee.department].managers;
const thisManagerAlreadyAdded = !!managers.find(manager => manager.id === employee.manager);
if (!thisManagerAlreadyAdded) {
managers.push(ReturnOneUser(employee.manager));
}
能否添加虚拟employeesArray?foreach
不是有效的Javascript数组函数。资本化很重要。@CertainPerformance,是的,当然。非常感谢。更新的示例包含了您的更正。@Md.AbuTaher,这不就是将问题转移到另一个数组吗?我非常确定我已经多次解决了完全相同的问题。让我补充一个答案。