【问题标题】:Is there a way to count a value between 2 array of objects and then merge it into one array?有没有办法计算 2 个对象数组之间的值,然后将其合并到一个数组中?
【发布时间】:2021-03-27 15:57:17
【问题描述】:

所以我有这个数组

departments: [
  {
   name: 'smthg',
   persons: 0,
  },
  {
   name: 'anotherone',
   persons: 0,
  },
  {
   name: 'and anotherone',
   persons: 0,
  },
]

还有这个数组

persons: [
  {
   name: 'John',
   email: 'blabla@gmail.com',
   department:'smthg'
  },
  {
   name: 'Ninja',
   email: 'lalala@gmail.com',
   department:'anotherone'
  },
  {
   name: 'Tom',
   email: 'oooo@gmail.com',
   department:'anotherone'
  },
]

所以我的问题是我想知道每个部门有多少角色。我尝试使用地图和过滤功能,但不知道如何真正接近它。

我的期望

我希望部门数组可以通过某些功能更新,其中包含适当数量的人员

【问题讨论】:

  • 请展示您为自己解决此问题所做的任何尝试。您应该尝试过,然后我们可以帮助您进行调试。 meta.stackoverflow.com/questions/261592/… 还评论How to Ask
  • 如果你想更新部门数组,那么你需要遍历它,然后找到那个部门的所有人,你的计数是.length的过滤结果

标签: javascript arrays javascript-objects


【解决方案1】:

只需使用.map.filter

const departments = [
  {
   name: 'smthg',
   persons: 0,
  },
  {
   name: 'anotherone',
   persons: 0,
  },
  {
   name: 'and anotherone',
   persons: 0,
  }
]

const persons = [
  {
   name: 'John',
   email: 'blabla@gmail.com',
   department:'smthg'
  },
  {
   name: 'Ninja',
   email: 'lalala@gmail.com',
   department:'anotherone'
  },
  {
   name: 'Tom',
   email: 'oooo@gmail.com',
   department:'anotherone'
  }
]

console.log(
    departments.map((department) => {
        department.persons = persons.filter((person) => person.department === department.name).length;
        return department;
    })
);

【讨论】:

  • 请记住,这既创建了一个新数组,又修改了原始数组,因为新数组和旧数组都具有相同的元素。
【解决方案2】:

这里有一个选项,它从persons 数组创建deptCount 对象,然后循环通过departments 数组,改变persons 属性。这可能比在循环内部使用循环的解决方案更有效,但很可能没有足够的人员或部门来真正影响它。

const departments = [
  {
   name: 'smthg',
   persons: 0,
  },
  {
   name: 'anotherone',
   persons: 0,
  },
  {
   name: 'and anotherone',
   persons: 0,
  },
]

const persons = [
  {
   name: 'John',
   email: 'blabla@gmail.com',
   department:'smthg'
  },
  {
   name: 'Ninja',
   email: 'lalala@gmail.com',
   department:'anotherone'
  },
  {
   name: 'Tom',
   email: 'oooo@gmail.com',
   department:'anotherone'
  },
]

const deptCounts = persons.reduce((acc, el) => {
  acc[el.department] = (acc[el.department] || 0) + 1;
  return acc;
}, {});

departments.forEach(dept => {
  dept.persons = (deptCounts[dept.name] || 0);
});

console.log(departments);

【讨论】:

  • 为什么是dept.persons +=?恕我直言,dept.persons = 会更干净。 +1 线性时间。
【解决方案3】:

调用updateDepartments() 将使用更新后的persons 计数更新部门变量

const departments = [
  {
    name: 'smthg',
    persons: 0,
  },
  {
    name: 'anotherone',
    persons: 0,
  },
  {
    name: 'and anotherone',
    persons: 0,
  },
]

const persons = [
  {
    name: 'John',
    email: 'blabla@gmail.com',
    department:'smthg',
  },
  {
    name: 'Ninja',
    email: 'lalala@gmail.com',
    department:'anotherone',
  },
  {
    name: 'Tom',
    email: 'oooo@gmail.com',
    department:'anotherone',
  },
]

function updateDepartments() {
  persons.forEach(person => {
    const index = departments.findIndex(department => department.name === person.department)
    if (index) {
      departments[index].persons++
    }
  })
}

updateDepartments()

【讨论】:

    猜你喜欢
    • 2020-03-06
    • 2021-02-28
    • 2017-12-31
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多