【问题标题】:filter array with same values过滤具有相同值的数组
【发布时间】:2022-01-07 12:16:25
【问题描述】:

我需要找到所有具有相同项目(ProjectID)的员工(EmpID),数据将是动态的,例如这个数组。

[
  { EmpID: '143,', ProjectID: '12,', DateFrom: '2013-11-01,', DateTo: '2014-01-05\r' },
  { EmpID: '218,', ProjectID: '10,', DateFrom: '2012-05-16,', DateTo: 'NULL\r' },
  { EmpID: '143,', ProjectID: '10,', DateFrom: '2009-01-01,', DateTo: '2011-04-27' },
];

我希望这个数组是 ->

[
  { EmpID: '218,', ProjectID: '10,', DateFrom: '2012-05-16,', DateTo: 'NULL\r' },
  { EmpID: '143,', ProjectID: '10,', DateFrom: '2009-01-01,', DateTo: '2011-04-27' },
];

【问题讨论】:

标签: javascript arrays filter


【解决方案1】:

您应该可以使用Array.reduce 来完成此操作

// The "trick" is to pull out the first item and then use that as the match candidate
const [head, ...tail] = [{ EmpId: 1 }, { EmpId: 2 }, { EmpId: 1 }]

const output = tail.reduce(
  (acc, b) => {
    if (acc.map(o => o.EmpId).includes(b.EmpId)) {
      acc.push(b)
    }
    return acc
  },
  [head]
)

【讨论】:

    【解决方案2】:

    试试这样的:

    const projectEmployees = employees.filter( emp => emp.ProjectID === '12' );
    

    请参阅Array.filter() 了解详细信息。

    或者...自己动手:

    function selectEmployeesByProjectId( employees, id ) {
      let projectEmployees = [];
      for ( const emp of employees ) {
        if ( emp.ProjectID === id ) {
          projectEmployees.push(emp);
        }
      }
      return projectEmployees;
    }
    

    如果您的数据是真正动态的并且您不知道它的真实形状,除了它是一个对象列表,只需使您的函数灵活,如下所示。 [但是您仍然需要知道要匹配哪些属性或属性才能进行过滤。

    function selectMatchingObjects( listOfObjects, isWanted ) {
      return listOfObjects.filter( isWanted );
    }
    

    其中isWanted 是一个函数,它接受一个对象,如果要保留该对象,则返回布尔值true,如果要丢弃该对象,则返回false

    一旦你有了,你就可以做类似的事情

    function selectEmployeesByProject( employees , projectIdKey , projectId ) {
      const isWanted = emp = emp[projectIdKey] === projectId;
      return employees.filter( isWanted );
    }
    

    然后

    const employees = getMySomeDynamicEmployees();
    . . .
    const projectEmployees = selectEmployeesByProject(employees, 'ProjectId', '10');
    

    【讨论】:

    • 是的,但是数组中的数据是动态的,不知道会是什么。我必须为动态数据创建一个函数。
    • 然后更新您的问题以更清楚。 @dani
    • 这是实现它的最简单方法,因为它跳过了查找属性。在动态数据和 project_id 方面,您应该能够从数组中的第一项中选择 project_id 并将其用作参数
    • @dani - 请参阅我修改后的答案。如果这样的事情不起作用,您需要更好地准确解释您要完成的工作。无论您做什么,您都必须以某种方式 (1) 识别要过滤的一个或多个属性,以及 (2) 决定哪些值或值组合可以识别 Keepers。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多