【问题标题】:JS Push element to array if it does not exist, then re-evaluate arrayJS将元素推送到数组,如果不存在,则重新计算数组
【发布时间】:2018-04-21 20:12:52
【问题描述】:

我正在使用以下内容。

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)

在我的测试中,该数组始终具有 length0。因此,我假设 JS 解释器 (Node.js) 不会在每次执行 forEach 时重新检查数组。到目前为止,我还尝试了数组 indexOf 方法和 for 循环,但在数组中没有找到任何管理器。

那么,如何添加一个未找到的管理器,然后为下一个管理器重新评估该数组?

【问题讨论】:

  • 你能添加一个虚拟的employeesArray吗?
  • foreach 不是有效的 Javascript 数组函数。大小写很重要。
  • @CertainPerformance,是的,当然。谢谢你。已更新示例以包含您的更正。
  • @Md.AbuTaher,这不是将问题转移到另一个数组吗?
  • 我很确定我已经多次解决了这个完全相同的问题。让我添加一个答案。

标签: javascript arrays ecmascript-6 iteration


【解决方案1】:

移动条件不能解决您的问题吗?

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;
        }
    });
});

【讨论】:

    【解决方案2】:

    您可以使用 .find 来检查用户是否已经存在于某个数组中。

    即,如果managers 是当前数组,那么使用.find 将始终再次遍历整个数组并检查结果。那是考虑到manager.idemployee.manager 都是字符串。

    !!managers.find(manager => manager.id === employee.manager);
    

    如果您在开始时使用!!,它将返回一个布尔值。您不需要使用任何thisManagerAlreadyAdded 样式代码。

    所以你可以简单地使用它,

    const managers = employeesByDepartment[employee.department].managers;
    const thisManagerAlreadyAdded = !!managers.find(manager => manager.id === employee.manager);
    if (!thisManagerAlreadyAdded) {
        managers.push(ReturnOneUser(employee.manager));
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 2019-09-15
      • 2014-12-07
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多