用ES6中的reduce高阶函数组装查询表单分隔字符数据

简介: 上古时代,我们为了遍历都是用for循环,直到es6的出现,给我们带来了一系列好用的新特性,map、filter、find、findIndex、some、every...各个都是好手,使用这些高阶函数能极大的方便我们快速处理数据

es6时代

上古时代,我们为了遍历都是用for循环,直到es6的出现,给我们带来了一系列好用的新特性,map、filter、find、findIndex、some、every...各个都是好手,使用这些高阶函数能极大的方便我们快速处理数据。

比如用map遍历接口数据,再用filter来过滤我们最终想要的数据,用find直接从一堆数据中找到我们想要的那个...

我和reduce的渊源

上面的那些处理数据的es6提供的api我确实经常用,但是还有一个reduce,实话说我以前没用过,但是知道有这么个东西。最开始对它有很深的影响,是我一同事在项目中老用,每次看到他写的代码,就很好奇为啥那么喜欢用这个,难道map不香吗?

终于发现了reduce很香

查询表单,一次输入多个参数,一般是从网站或者excel中复制,要求前端用空格、逗号或者回车切割参数,传给后端。

这个需求也很常见,之前是先用 split 分隔成数组,再用 map 遍历去掉首尾空格,最后再用 filter 来过滤下空值,但是这样需要遍历两次,如果想只用一个 map 实现,那还得额外定义个变量来储存数据。

正好项目也不太忙,于是我开始研究怎么能更优雅地实现上面的数据过滤,最终找了一圈才发现了reduce的香。

其实像这种组装数据用 reduce 就能完美解决,一般有的后端要求用户没填的参数就不传,不需要传个空字符串或者空数组这种,那我们reduce的初始值直接给成 undefined 就不会传给后端了,不过注意 push 的时候就要额外判断下了,否则会报错。

用回车、中英文逗号或空格分隔字符正则:/\n+|,|,|\s+/g

利用 reduce 过滤组装数据 demo:

let a = [' ', '1  ', 'zhou', '  ']
let b = a.reduce((m, n) => {
   
  if (n) {
   
    const txt = n.trim()
    if (txt) m.push(txt)
  }
  return m
}, [])
console.log(b) // ['1', 'zhou']
AI 代码解读

项目中使用完整示例代码:

// 请求数据
async query() {
   
  const {
    orderIds, names } = this.queryForm
  let params = {
   
    page: this.page.index,
    size: this.page.size,
  }
  this.fmtParams(params, 'orderIds', orderIds)
  this.fmtParams(params, 'names', names)

  const res = await this.$axios({
   
    method: 'post',
    url: 'cafe123/api/info',
    data: params,
  })
  if (res.success) {
   
    console.log(res)
  }
}

// 格式化参数
fmtParams(params, key, val) {
   
  // if (val) {
   
  //   params[key] = val.split(/\n+/g).map(a => a.trim()).filter(a => a)
  // }
  if (val) {
   
    // 初始值设为 undefined,未填写有效数据时不需要传参数,如都是敲的空格、回车
    // 以回车、中英文逗号或空格分隔
    const list = val.split(/\n+|,|,|\s+/g)
    params[key] = list.reduce((m, n) => {
   
      if (n) {
   
        const txt = n.trim()
        if (txt) {
   
          if (!m) m = []
          m.push(txt)
        }
      }
      return m
    }, undefined)
  }
}
AI 代码解读

其实很多事情都是一样,从你知道,到你真的理解,再到你实践,最后到你发现它的香,每一次进阶你都需要经历一个阶段,凡事还是多问几个为什么!

目录
打赏
0
0
0
0
68
分享
相关文章
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
【面试题】JS的14种去重方法,看看你知道多少(包含数组对象去重)
132 0
通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
array.reduce()可以用来数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据、性能优化等,使用难度相对高一些,但是能大大减少代码量。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时
利用ES6中的...扩展运算符来合并数组
本文介绍了使用ES6的新特性简化JavaScript编程的多种方法。其中包括使用扩展运算符`...`优雅地合并数组,解构赋值快速提取数组和对象值,`for...of`循环及箭头函数提升数组遍历效率,`find`方法简化数组搜索,`+`号与短路运算符优化数据类型转换及默认值设置,以及模板字符串和扩展运算符增强的对象合并技巧,这些方法让代码更加简洁高效。
72 0
Java【代码分享 06】Lamda表达式将List对象中的Map对象的key全部转化为大写或者小写(去除外层循环:可用于Map对象中的key全部转化为大写或者小写)
Java【代码分享 06】Lamda表达式将List对象中的Map对象的key全部转化为大写或者小写(去除外层循环:可用于Map对象中的key全部转化为大写或者小写)
428 0
es6扩展运算符、concat方法合并多个数组
es6扩展运算符、concat方法合并多个数组
66 0
API接口获得数据后处理JS数组(包含字符串对象)分组、过滤和筛选的解决方案
API接口获得数据后处理JS数组(包含字符串对象)分组、过滤和筛选的解决方案
193 0
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
如何将分隔数据转换为多值IN列表、如何按字母顺序排列字符串、如何对字符串字母去重后按字母顺序排列字符串、如何删除字符串中的字符保留数字。【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。这篇文章还是介绍的字符串处理案例,还是那句话,这些操作太太太常见了。后面还会写,而且是更麻烦更难的需求。
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
python中函数的序列传参,列表拆解传参、字典拆解传参
python中函数的序列传参,列表拆解传参、字典拆解传参
243 0
如何使用reduce(),filter()对数据进行求积,去除None,空字符串
如何使用reduce(),filter()对数据进行求积,去除None,空字符串
128 0