我真的了解数组嘛

在日常的业务开发中,我们通常需要对后端返回的数据解构进行处理,得到我们想要的格式,而其中比较常见的场景便是对数组的操作。最开始用的时候只是看他人写法或者去菜鸟教程大致看一下demo,对于一些方法之间的区别、是否运用得合理没有明确的概念。一些用的较少的方法,还需要去google一下(惭愧.jpg)。还有一些方法(比如reduce)是之前有同学推荐过,但是一直没去用的,这次希望也能彻底搞定。因此本次博客希望对数组相关的方法进行一个比较深入的总结,希望通过这次学习我能真正地了解数组,最好也不要再用一次“gugou”一次了QAQ。

1.some 和 find
当我们需要在数组中寻找一个元素时,我们通常会想到Array.find。它需要一个回调函数,并返回符合条件的第一个元素。然而,当我们仅仅需要知道数组中是否存在符合条件的元素时,Array.some或许是一个更好的办法,因为它返回的是一个布尔值。
语法:Array.find(fn, thisArg)
fn 表示在数组每一项上执行的函数,接受三个参数:
value 当前正在被处理的元素的值
index 当前元素的数组索引
array 数组本身
thisArg 可选,用来当做fn函数内的this对象
说到find,在es6中它有一个兄弟Array.findIndex。它的入参和find基本一致,只不过它返回的是第一个符合条件的项在数组中的位置,如果没有符合条件的则返回-1。

2.find 和 filter
filter的中文意思是过滤,正如其名字所言,它的功能便是通过回调函数过滤数组,并将过滤后的项作为一个新数组返回。
看到上文中我们丢下find使用some的场景,find有些不服气。find曰:看看下面这个场景——我们需要通过一个唯一的ID 为过滤条件去过滤一个数组。如果此时用Array.filter的话,它将会遍历整个数组,当数组项很多时会多次执行回调函数。而明显本场景最终将只有一个符合条件的数据,我们用find在搜寻到第一个符合条件的结果后立即返回。从性能的角度上来说,让我们恭喜find!

3.indexOf 和 includes
Array.indexOf这个方法我们都狠熟悉了,它返回第一个指定元素的下标,如果不存在则返回-1。如果我们不需要知道下标,可以使用直接返回布尔值的 Array.includes。说到返回布尔值,你们有没有想起上面提到的some呢。注意了,注意了,一定要分清楚哦。Array.includes 的第一个入参是一个值, Array.some 的第一个入参是回调函数。includes简单,而some方法可以用来处理较为复杂的数组项哦。

4.reduce来咯
我们什么情况下可以使用reduce呢,有一个比较容易记的方法。当一个场景中我们需要先用Array.filter对数组进行过滤操作,然后对其进行遍历,用map方法返回一个新数组。此时我们可以用Array.reduce方法,一样的味道,更好的配方哦。Array.reduce方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])。
callback 接受四个参数,分别是:accumulator,累加器累加回调的返回值; currentValue,数组中正在处理的元素;currentIndex(可选),数组中正在处理的当前元素的索引;array(可选),调用 reduce() 的数组。initialValue 为可选参数,作为第一次调用 callback 函数时的第一个参数的值。方法的返回值是函数累计处理的结果。
PS:这里通过查阅资料还得知了mdn的语法,可选参数用括号+逗号 [,表示,而必需的参数只用逗号,
光说不练假把式,让我们来进入实战!
emmm我们来模拟一个后端童鞋返回的数据。
[{
id: 1,
name: 'A',
number: 6
}, {
id: 2,
name: 'B',
number: 9
}, {
id: 3,
name: 'C‘,
number: 2
},...]

Round 1

先从简单的开始,我们来统计number的总和吧。

arr.reduce((total, { number }) => {
  return total + number;
})
Round 2

加大难度,我们来将数组每项转换为字符串,项之间用空格隔开。

arr.reduce((str, { id, name }) => {
  return str + `id:${id},type:${name}+ `;
}, '')
Round 3

boss关,我们来将数组转换成 key value 的对象形式。

arr.reduce((obj, { id, ...value }) => {
  obj[id] = {
    ...value,
  }
  return obj;
}, {})

最终返回的结果为

{
  '1': { name: 'A', number: 6 },
  '2': { name: 'B', number: 9 },
  '3': { name: 'C', number: 2 }
}

闯关成功,希望我们能学以致用,在今后的工作中很好滴运用这个方法😄

5.foreach 和 map
首先,我们可以明确的是,forEach()方法不会返回执行结果,而是undefined,而map()方法会得到一个新的数组并返回。forEach()允许callback更改原始数组的元素。map()返回新的数组。
项目中有很多地方直接在map方法的回调函数中修改原始数组的值,其实这样做是不建议的。这么做能行得通是因为js中的数组是引用类型,所以可以利用类似指针的特性通过改变另一个变量去修改原始的值。但是!但是!map方法体现的是数据不可变的思想。该思想认为所有的数据都是不能改变的,只能通过生成新的数据来达到修改的目的,因此直接对数组元素或对象属性进行操作的行为都是不可取的。这种思想其实有很多好处,最直接的就是避免了数据的隐式修改。我们来举个栗子。

let arr = [{
    a:1,
    b:2,
}, {
    a:3,
    b:4,
}];
//让我们来修改a的值为3
arr = arr.map((item) => {   // 返回一个新的数组
    return {
        ...item,
        a:3
    }
});

emmm可能还有一些数组的方法没有照顾周全,如果以后还遇到一些问题和一些对数组巧妙操作的方法,我们再记录。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353