函数参数归一化

 我们有一个数组对象,里面的内容,如下:

const arr = [
    { name: 'Jack', age: 20, sex: '男' },
    { name: 'Emily', age: 22, sex: '女' },
    { name: 'Michael', age: 23, sex: '女' },
    { name: 'Taylor', age: 25, sex: '男' },
    { name: 'Johnson', age: 20, sex: '男' },
    { name: 'William', age: 22, sex: '男' },
    { name: 'Elizabeth', age: 23, sex: '女' },
    { name: 'Andrew', age: 25, sex: '女' },
    { name: 'Wilson', age: 23, sex: '男' },
    { name: 'Andrew', age: 22, sex: '女' }
];

我们有个需求:按照年龄分组,年龄作为对象的键名,值为分类的数组

const groupBy=(arr)=>{
   const newObj = {};
   for (let i of arr) {
     let key = i.age; 
     if (!newObj[key]) {
       newObj[key] = [];
     }
     newObj[key].push(i);
   }
   console.log(newObj);
 }
 groupBy(arr)

打印的结果:

{
  '20': [
    { name: 'Jack', age: 20, sex: '男' },
    { name: 'Johnson', age: 20, sex: '男' }
  ],
  '22': [
    { name: 'Emily', age: 22, sex: '女' },
    { name: 'William', age: 22, sex: '男' },
    { name: 'Andrew', age: 22, sex: '女' }
  ],
  '23': [
    { name: 'Michael', age: 23, sex: '女' },
    { name: 'Elizabeth', age: 23, sex: '女' },
    { name: 'Wilson', age: 23, sex: '男' }
  ],
  '25': [
    { name: 'Taylor', age: 25, sex: '男' },
    { name: 'Andrew', age: 25, sex: '女' }
  ]
}

这样固定字段不太灵活,如果需求在一直变化,函数需要写很多个,可能下次需求以sex分组,代码做一次改进

const groupBy=(arr,propName)=>{
   const newObj = {};
   for (let i of arr) {
     let key = i[propName];
     if (!newObj[key]) {
       newObj[key] = [];
     }
     newObj[key].push(i);
   }
   console.log(newObj);
 }
 groupBy(arr,'age')
 groupBy(arr,'sex')

打印的结果:

//age分组
{
  '20': [
    { name: 'Jack', age: 20, sex: '男' },
    { name: 'Johnson', age: 20, sex: '男' }
  ],
  '22': [
    { name: 'Emily', age: 22, sex: '女' },
    { name: 'William', age: 22, sex: '男' },
    { name: 'Andrew', age: 22, sex: '女' }
  ],
  '23': [
    { name: 'Michael', age: 23, sex: '女' },
    { name: 'Elizabeth', age: 23, sex: '女' },
    { name: 'Wilson', age: 23, sex: '男' }
  ],
  '25': [
    { name: 'Taylor', age: 25, sex: '男' },
    { name: 'Andrew', age: 25, sex: '女' }
  ]
}
//sex分组
{
  '男': [
    { name: 'Jack', age: 20, sex: '男' },
    { name: 'Taylor', age: 25, sex: '男' },
    { name: 'Johnson', age: 20, sex: '男' },
    { name: 'William', age: 22, sex: '男' },
    { name: 'Wilson', age: 23, sex: '男' }
  ],
  '女': [
    { name: 'Emily', age: 22, sex: '女' },
    { name: 'Michael', age: 23, sex: '女' },
    { name: 'Elizabeth', age: 23, sex: '女' },
    { name: 'Andrew', age: 25, sex: '女' },
    { name: 'Andrew', age: 22, sex: '女' }
  ]
}

还可能遇到组合字段的分类,例如'25-男',上面方法就没法实现,就需要对代码进行进一步改进

const groupBy=(arr,propFn)=>{
   const newObj = {};
   for (let i of arr) {
     let key = propFn(i);
     if (!newObj[key]) {
       newObj[key] = [];
     }
     newObj[key].push(i);
   }
   console.log(newObj);
 }
  groupBy(arr,item=>`${item.age}-${item.sex}`)

打印结果:

{
  '20-男': [
    { name: 'Jack', age: 20, sex: '男' },
    { name: 'Johnson', age: 20, sex: '男' }
  ],
  '22-女': [
    { name: 'Emily', age: 22, sex: '女' },
    { name: 'Andrew', age: 22, sex: '女' }
  ],
  '23-女': [
    { name: 'Michael', age: 23, sex: '女' },
    { name: 'Elizabeth', age: 23, sex: '女' }
  ],
  '25-男': [ { name: 'Taylor', age: 25, sex: '男' } ],
  '22-男': [ { name: 'William', age: 22, sex: '男' } ],
  '25-女': [ { name: 'Andrew', age: 25, sex: '女' } ],
  '23-男': [ { name: 'Wilson', age: 23, sex: '男' } ]
}

虽然我们能够自定义了分组的条件,但是传值的类型始终受到限制,我们只能传方法,可是我们想要的是:传入的参数为方法,那么就按照定义的方法来分组,传的为值,那就按照传入的值来分组,无论我们传入的任何值,都会自动转换为方法,那按照这个思路,我们只需要将传入的值,或者方法,统一变为方法执行,那这个方法就会变得非常灵活了:

const groupBy=(arr,propFn)=>{
    if(typeof propFn ==='string'){
      const propsName=propFn
      propFn=item=>item[propsName]
    }
    const newObj = {};
    for (let i of arr) {
      let key = propFn(i);
      if (!newObj[key]) {
        newObj[key] = [];
      }
      newObj[key].push(i);
    }
    console.log(newObj);
  }

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值