Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.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 JS将元素推送到数组中,如果它不存在,则重新计算数组_Javascript_Arrays_Ecmascript 6_Iteration - Fatal编程技术网

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,这不就是将问题转移到另一个数组吗?我非常确定我已经多次解决了完全相同的问题。让我补充一个答案。