百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

ES6 数组的遍历方法最重要的不在代码本身,而是语义化!

toyiye 2024-06-28 10:11 16 浏览 0 评论

前言

不知不觉,ES6 的数组新语法已经出了好多年了,大家都应该理解一句话: ES6 数组方法带来的最大优势是语义化

很多人在使用 ES6 数组语法时,将它当作了便捷操作。

甚至更多千奇百怪的用法,我希望大家在看完该文章后,去检查一下自己的项目中,这些语法是否可以一眼让大家看出这些方法是做什么用的。

反面操作

这里简单列举一些反面操作:

  • 将 map 作为循环使用,通过 map 计算总数
const arr = [{..., count: 1}, {..., count: 5}]

const total = 0;
arr.map(v => {
    total += v.count
})


  • 将 map 作为循环使用,改变数组中的对象的属性
// 操作1
let arr = [{..., id: '1'}, {..., id '2'}]
arr = arr.map(v => ({...v, id: Number(id)}))

// 操作2
let arr = [{..., id: '1'}, {..., id '2'}]
arr.map(v => {
    v.id = Number(v.id)
})


其中尤其是改变对象属性中的操作1,是误用最多的用法。

讲解

我一般不做基本语法讲解,因为罗列式的讲解让你左脑进右脑出,不带给大家任何价值。面向实际的使用才能让大家影响深刻。

接下来,我将假设自己是一个快递站的老板,我作为一个快递站的老板,应该如何通过这些语法来处理我的快递。

为了让代码更清晰,我将以 ed 来作为快递的简称(express delivery)

map

语义 :将一些东西转换为另一些东西。

正面示例:
我需要将所有的 快递单号 + 派送时间 整理出来,来决定我的送货顺序。

const edArr = [{..., id: '666666666', date: '2024-02-23'}, {..., id: '666666688', date: '2024-02-22'}, ...]

const data = edArr.map(v => ({id: v.id, date: v.date}))


反面示例:
我希望给所有快递贴一个广告。

let edArr = [{..., id: '666666666', date: '2024-02-23'}, {..., id: '666666688', date: '2024-02-22'}, ...]

edArr = edArr.map(v => ({...v, ad: '要问快递哪家强,就来掘金找sincenir!'}))


虽然反面案例也能实现,并且也没有代码量的提升,但是我强烈不建议这么干。这会大大降低你代码的可阅读性。

foreach

语义:我希望循环做某些事。

显然,相较于 map ,上面的反面案例应该交由 foreach 操作,而正面案例则是 foreach 的反面案例。这两者大家常常是反着用的。

正面示例:
我希望给所有快递贴一个广告。

let edArr = [{..., id: '666666666', date: '2024-02-23'}, {..., id: '666666688', date: '2024-02-22'}, ...]
edArr.foreach(v => { v.ad = '要问快递哪家强,就来掘金找sincenir!' })


反面示例:
我需要将所有的 快递单号 + 派送时间 整理出来,来决定我的送货顺序。

const edArr = [{..., id: '666666666', date: '2024-02-23'}, {..., id: '666666688', date: '2024-02-22'}, ...]

const data = []
edArr.foreach(v => {
    data.push({id: v.id, date: v.date})
})


filter

语义:我希望筛选出来一些东西。

正面示例:
我希望找到所有用户拒收的快递,发回给快递公司。

const edArr = [{..., reject: false}, {..., reject: true}, ...]
const rejectEdArr = edArr.filter(v => v.reject === true)


反面示例:
我希望找到单号为 8888 的快递。

const edArr = [{..., id: '6666'}, {..., id: '8888'}, ...]
const nArr = edArr.filter(v => v.id === '8888')


显而易见的是,快递单号是唯一的,用 filter 在这里是不合适的。
因为它最多筛选出一个符合条件的快递,且这个一是已知的。

find

语义:找一个符合条件的给我。

正面示例:
快递员:我车装差不多了,再给我一个 270号楼 的快递,我一块儿送过去。

const edArr = [{..., address: '271'}, {..., address: '270'}, ...]
const oneEd = edArr.find(v => v.address === '270')


反面示例:
顾客:今天有没有我的快递?

const edArr = [{..., user: 'zhangsan'}, {..., user: 'sincenir'}, ...]
const ed = edArr.find(v => v.user === 'sincenir')

if (ed) {
    // 有
} else {
    // 没有
}


findIndex

语义:找符合条件的是第几个。

正面示例:
快递员:我今天还需要送多少快递?

const edArr = [{..., date: '2024-02-23'}, {..., date: '2024-02-24'}, ...]
const count = edArr.findIndex(v => v.date !== '2024-02-23') + 1


反面示例:
顾客:今天有没有我的快递?

const edArr = [{..., user: 'zhangsan'}, {..., user: 'sincenir'}, ...]
const haveSincenir = edArr.find(v => v.user === 'sincenir') > -1


这里需要提醒大家,findIndex 是滥用极其严重的函数,包括有没有很多人都喜欢用 findIndex 去做,这些都是不对的。
当你不知道你是否要使用 findIndex 时,据我观察,大多数时候都应该使用别的语法。

some

语义:这里有没有符合条件的。

正面示例:
顾客:这里有没有我的快递?

const edArr = [{..., user: 'zhangsan'}, {..., user: 'sincenir'}, ...]
const haveSincenir = edArr.some(v => v.user === 'sincenir')


every

语义:这里是否全符合条件。

正面示例:
快递员:今天还有没有需要送的快递啦?

const edArr = [{..., date: '2024-02-23'}, {..., date: '2024-02-24'}, ...]
const haveToday = edArr.every(v => v.date !== '2024-02-23')


reduce

语义:基于这些帮我算一个东西。

正面示例:
咱们今天收的快递总共多少钱啊?我算算账对不对。

const edArr = [{..., amount: '13'}, {..., amount: '20'}, ...]
const totalAmount = edArr.reduce((r, v) => (r + v.amount), 0)


最后

语义化最重要的点在于,我们看到代码的第一眼,不需要看细节就能明白我们究竟准备做什么。
而不是为了便捷去使用这些方法,否则你的代码依旧是面条形状的面向过程编程。

最后我们总结下所有语法的语义:

  • map: 将一些东西转换为另一些东西
  • foreach: 我希望循环做某些事
  • filter: 我希望筛选出来一些东西
  • find: 找一个符合条件的给我
  • findIndex: 找符合条件的是第几个
  • some: 这里有没有符合条件的
  • every: 这里是否全符合条件
  • reduce: 基于这些帮我算一个东西


作者:sincenir
链接:https://juejin.cn/post/7338397590008283175

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码