【优化代码结构】数据分组引发的思考

封装一个函数,可以根据下面数据以 某一项 分组

const person = [
  { name: "张三", age: 23, sex: "男" },
  { name: "李四", age: 23, sex: "男" },
  { name: "王五", age: 25, sex: "女" },
  { name: "赵六", age: 23, sex: "男" },
  { name: "钱七", age: 27, sex: "女" },
  { name: "孙八", age: 27, sex: "男" },
  { name: "周九", age: 29, sex: "女" },
  { name: "吴十", age: 23, sex: "女" },
  { name: "郑十一", age: 31, sex: "男" },
  { name: "王十二", age: 31, sex: "男" },
  { name: "李十三", age: 33, sex: "女" },
  { name: "张十四", age: 31, sex: "男" },
  { name: "李十五", age: 33, sex: "男" },
]

function groupBy(arr, propName) {
  const result = {}
  for (const ele of arr) {
    const key = ele[propName]
    if (!result[key]) {
      result[key] = [ele]
    } 
    result[key].push(ele)
  }
  return result
}

groupBy(person, 'sex')
groupBy(person, 'age')

此时通用性不够强大,例如增加需求:key为 「年龄-性别」、数据中每个对象有个属性address也为对象并根据address中的city进行分组。

groupBy参数变为函数,此时 groupBy 就变成了高阶函数,对key的获取也更加灵活。

function groupBy(arr, generateKey) {
  const result = {}
  for (const ele of arr) {
    const key = generateKey(ele)
    if (!result[key]) {
      result[key] = [ele]
    } else {
      result[key].push(ele)
    }
  }
  return result
}

groupBy(person, item => item.sex)
groupBy(person, item => item.age)
groupBy(person, item => `${item.age}-${item.sex}`)
// 奇偶数分组
groupBy([1, 4, 12, 3, 5], item => item % 2 === 0 ? '偶数' : '奇数')

继续优化,对于只针对某属性分组,如何仍然通过groupBy(person, 'sex')这种简单方式调用,需要使用 参数归一化 思想,在函数内部将传入的字符串也转为函数写法,具体可看本人另一篇文章参数归一化

function groupBy(arr, generateKey) {
  if (typeof generateKey === 'string') {
    let key = generateKey
    generateKey = (item) => item[key]
  }
  const result = {}
  for (const ele of arr) {
    const key = generateKey(ele)
    if (!result[key]) {
      result[key] = [ele]
    } else {
      result[key].push(ele)
    }
  }
  return result
}

groupBy(person, 'sex')
groupBy(person, 'age')
groupBy(person, item => `${item.age}-${item.sex}`)
// 奇偶数分组
groupBy([1, 4, 12, 3, 5], item => item % 2 === 0 ? '偶数' : '奇数')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田本初

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值