请教一个问题。

我想统计一下部门人员登录数据。数据大概如下:
登录数据

{'张三','赵六','张三','张三','孙杨','周瑜','黄盖','黄盖','张卫健','黄盖1'}

部门人员数据

{'张三','李四','赵六','钱七','孙杨','周瑜','黄盖','诸葛亮','刘备'}

所以,该部门的登录数据为5

阅读 1.7k
3 个回答
function checkCount(loginList, deptList) {
  const loginSet = new Set(loginList)

  return deptList.filter(user => loginSet.has(user)).length
}

const deptList = ['张三', '李四', '赵六', '钱七', '孙杨', '周瑜', '黄盖', '诸葛亮', '刘备']
const loginList = ['张三', '赵六', '张三', '张三', '孙杨', '周瑜', '黄盖', '黄盖', '张卫健', '黄盖1']

checkCount(loginList, deptList) // 5

可以先把两个Array变成Set,再遍历login set,检查登录用户是否在部门用户里面。

使用Set首先是为了去重,减少后序遍历检查次数,另外Set的has操作的复杂度一般来说是O(1)(取决于浏览器实现,不过一般都是基于哈希表)。

const departmentList = ['张三', '李四', '赵六', '钱七', '孙杨', '周瑜', '黄盖', '诸葛亮', '刘备']
const loginList = ['张三', '赵六', '张三', '张三', '孙杨', '周瑜', '黄盖', '黄盖', '张卫健', '黄盖1']

function check(departmentList, loginList) {
  const departmentSet = new Set(departmentList)
  const loginSet = new Set(loginList)

  let count = 0

  for (const x of loginSet) {
    if (departmentSet.has(x)) {
      count++
    }
  }

  return count
}

console.log(check(departmentList, loginList)) // => 5
const logins = ["张三", "赵六", "张三", "张三", "孙杨", "周瑜", "黄盖", "黄盖", "张卫健", "黄盖1"];
const staffs = ["张三", "李四", "赵六", "钱七", "孙杨", "周瑜", "黄盖", "诸葛亮", "刘备"];

const allStaffs = new Set(staffs);
const count = new Set(logins.filter(it => allStaffs.has(it))).size;

staffs 生成 Set 的目的是为了方便查找,直接用数组,通过 find 或者 includes 查找也是可以的。

然后遍历 logins,把能从 staffs 中找到的那些留下,其他的剔掉。可以使用 filter 完成。

剩下的就是去重,用 Set 就能去重。如果需要列表,[...setObj] 就能拿到数组,但是只需要数量,直接取 size 就好了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题