如何在对象数组中迭代对象属性数组

时间:2017-09-05 17:35:27

标签: javascript arrays sorting ecmascript-6

我有一个对象数组,如下所示:

data = [
  {
    title: 'John Doe',
    departments: [
      { name: 'Marketing', slug: 'marketing'},
      { name: 'Sales', slug: 'sales'},
      { name: 'Administration', slug: 'administration'},
    ]
  },
  {
    title: 'John Doe Junior',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Sales', slug: 'sales'},
    ]
  },
  {
    title: 'Rick Stone',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Marketing', slug: 'marketin'},
    ]
  },
]

如何迭代每个对象的departments数组并创建新的数组,我将按部门对员工进行排序,以便最终结果如下:

operations = [
  {
    title: 'John Doe Junior',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Sales', slug: 'sales'},
    ]
  },
  {
    title: 'Rick Stone',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Marketing', slug: 'marketin'},
    ]
  },
]

marketing = [
  {
    title: 'John Doe',
    departments: [
      { name: 'Marketing', slug: 'marketing'},
      { name: 'Sales', slug: 'sales'},
      { name: 'Administration', slug: 'administration'},
    ]
  },
  {
    title: 'Rick Stone',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Marketing', slug: 'marketin'},
    ]
  },
]

动态创建这种数组的方法是什么?

更新

我尝试使用答案中的建议提出解决方案,在那里我将动态创建一个包含部门对象的数组,这些对象将有一系列员工:

const isInDepartment = departmentToCheck => employer => employer.departments.find(department => department.slug == departmentToCheck);

var departments = [];
function check(departments, name) {
  return departments.some(object => name === object.department);
}

employees.forEach((employee) => {
    employee.departments.forEach((department) => {
        let found = check(departments, department.slug);
        if (!found) { 
            departments.push({ department: department.slug }); 
        }
        });
});

departments.forEach((department) => {
    // push an array of employees to each department
    //employees.filter(isInDepartment(department));
});

但是,我不知道如何将员工阵列推送到我最后循环的数组中的对象? 这是fiddle

1 个答案:

答案 0 :(得分:1)

这个怎么样?我使用Array.protoype.filter操作,并使用高阶函数(在这种情况下是一个返回函数的函数)来创建谓词(返回布尔值的函数),该函数将检查员工是否在特定部门。我在代码中添加了一些(希望)澄清的评论。

修改:使用您提供的新代码和上下文this JSFiddle demo显示它如何协同工作。

const employees = [
  {
    title: 'John Doe',
    departments: [
      { name: 'Marketing', slug: 'marketing'},
      { name: 'Sales', slug: 'sales'},
      { name: 'Administration', slug: 'administration'}
    ]
  },
  {
    title: 'John Doe Junior',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Sales', slug: 'sales'}
    ]
  },
 	{
    title: 'Rick Stone',
    departments: [
      { name: 'Operations', slug: 'operations'},
      { name: 'Marketing', slug: 'marketin'}
    ]
  }
];

// given a department, this returns a function that checks
// whether an employee is in the specified department
// NOTE: the "find" returns the found object (truthy) 
// or undefined (falsy) if no match was found.
const isInDepartment = 
	departmentToCheck =>
  	  employee => employee.departments.find(dep => dep.name == departmentToCheck);

const employeesInMarketing = employees.filter(isInDepartment('Marketing'));
const employeesInOperations = employees.filter(isInDepartment('Operations'));

console.log('Employees in marketing', employeesInMarketing);
console.log('Employees in operations', employeesInOperations);