【问题标题】:How to filter out data on the basis of employee id and project id如何根据员工id和项目id过滤掉数据
【发布时间】:2022-12-06 21:39:54
【问题描述】:

我有一组具有单独任务的对象,我需要根据员工 ID 过滤掉每个任务,然后根据项目 ID 过滤掉每个任务,然后我需要检查结果数组中的小时总和是否小于 4。如果所有这些条件都满足,然后将这些值存储在数组中。这是来自 api 的响应。

nonallocated: [
  {
    empId: "1",
    task: {
      project: {
        projectId: "111"
      },
      total: '2'
    }
  },
  {
    empId: "2",
    task: {
      project: {
        projectId: "111"
      },
      total: '5'
    }
  },
{
    empId: "2",
    task: {
      project: {
        projectId: "333"
      },
      total: '1'
    }
  },
  {
    empId: "3",
    task: {
      project: {
        projectId: "111"
      },
      total: '2'
    }
  },
  {
    empId: "3",
    task: {
      project: {
        projectId: "111"
      },
      total: '1'
    }
  },
  {
    empId: "1",
    task: {
      project: {
        projectId: "222"
      },
      total: '5'
    }
  },
  {
    empId: "1",
    task: {
      project: {
        projectId: "111"
      },
      total: '1'
    }
  }
]

预期输出:

newArr = [
  //matching empId(1), projectId(111), total is less than 4 i.e 2+1=3
  {
   empId: "1",
   task: {
    project: {
      projectId: "111"
   },
   total: '2'
  }
 },
{
   empId: "1",
   task: {
    project: {
      projectId: "111"
   },
   total: '1'
  }
 },
// having only one data for same empID and projectId and total is less than 4
{
  empId: "2",
  task: {
    project: {
      projectId: "333"
    },
    total: '1'
  }
 },
//having same empId(3) and projectId(111) and total is less than 4 ie 
  2+1 =3
{
empId: "3",
task: {
  project: {
    projectId: "111"
  },
  total: '2'
}
},
{
  empId: "3",
  task: {
    project: {
      projectId: "111"
    },
    total: '1'
   }
  },
 ]

这不应仅限于一个 empId 或 projectId。我希望这些条件满足任何数据,例如我们可以有一个满足 empId 2 相同条件的数据。我想检索具有相同员工 ID、相同 projectId 且总计小于 4 的值的数据。如果我有一个没有与其他数据匹配的 empId 和 projectId 的数据,在这种情况下只需检查总数小于 4。

为相同的员工 ID 和相同的项目 ID 创建一个单独的数组。

【问题讨论】:

  • array.filter((e) => e.empId === 值) ?
  • 这有什么价值?我们要动态过滤

标签: javascript arrays


【解决方案1】:

我很难理解你想要什么,但我想就是这样。您仍然需要排序才能获得所需的确切输出,但就过滤而言没关系(如果我做对了):

const nonallocated = [
  {
    empId: "1",
    task: {
      project: {
        projectId: "111",
      },
      total: "2",
    },
  },
  {
    empId: "2",
    task: {
      project: {
        projectId: "111",
      },
      total: "5",
    },
  },
  {
    empId: "2",
    task: {
      project: {
        projectId: "333",
      },
      total: "1",
    },
  },
  {
    empId: "3",
    task: {
      project: {
        projectId: "111",
      },
      total: "2",
    },
  },
  {
    empId: "3",
    task: {
      project: {
        projectId: "111",
      },
      total: "1",
    },
  },
  {
    empId: "1",
    task: {
      project: {
        projectId: "222",
      },
      total: "5",
    },
  },
  {
    empId: "1",
    task: {
      project: {
        projectId: "111",
      },
      total: "1",
    },
  },
];

const totals = [];
const threshold = 4;

// initial filter

// then we calculate the totals for each pair of empId projectId
nonallocated.forEach((element) => {
  const index = totals.findIndex(
    (e) =>
      e.empId === element.empId &&
      e.projectId === element.task.project.projectId
  );
  if (index === -1) {
    // we add it to our totals
    totals.push({
      empId: element.empId,
      projectId: element.task.project.projectId,
      total: +element.task.total,
    });
  } else {
    // we increment it
    totals[index].total += +element.task.total;
  }
});

// then we filter when total is < 4
const filteredTotals = totals.filter((e) => e.total < threshold);

// finally we filter our inital array
const newArr = nonallocated.filter((e) =>
  filteredTotals.find(
    (f) => f.empId === e.empId && f.projectId === e.task.project.projectId
  )
);

console.log(newArr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多