常用数组处理函数和语法

本篇文章主要结合官方解释以及个人理解对 reduce()filter()map()every()some()展开运算符 做些总结。

<a name="redecu" id="reduce" >1、reduce() </a>

概述

reduce() 方法接收一个函数作为累加器( accumulator ),数组中的每个值( 从左到右 ),开始合并,最终为一个值。

语法

array.reduce(callback, [initialValue])

参数解释如下:

  • callback:执行数组中每个值的函数( 也可以叫reducer ),包含四个参数。
    • previousValue:上一次调用回调返回的值,或者是提供的初始值( initailValue )。
    • currentValue:数组中当前被处理的元素。
    • index:当前元素在数组中的索引。
    • array:调用 reduce 的数组
  • initialValue:作为第一次调用callback的第一个参数。非必需。

示例一

const completedCount = todos.reduce(
  ( count, todo ) => ( todo.completed ? count + 1 : count ),
  0
);

代码解释:

  • todos是一个数组。

  • reduce() 的第一个参数是箭头函数,这个箭头函数的第一个参数 count 是上一个的返回值( previousValue ),第二个参数todo是当前元素的值 ( currentValue )。

  • reduce() 的第二个参数0是个初始化值,作用是使 count 的初始值为0。

本示例目的为获取已完成条目的个数,即 completedCount,遍历数组的第一个值时,count 的值为0,todo 即当前遍历的元素,如果当前遍历的元素的 completed 为 true 的话,将 count + 1,否则返回 count 。遍历数组第二个值时,count 即遍历上一个元素时的返回值,此时 todo 为元素中的第二项,返回值加一或不变。

示例二

export default function todos(state = initialState, action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        {
          id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1,
          completed: false,
          text: action.text,
        },
        ...state,
      ];
    default:
      return state;
  }
}

代码解释:

本示例目的为添加新的条目,即 ADD_TODO ,遍历数组的第一个值时,maxId 的值为 -1,如果此时数组中没有元素,则返回 -1 后 +1,新的条目的 index 则为0,如果有第一个值时,todo 即为当前项,todo.id 则为 0,maxId 为 -1,取最大的,返回 0 后 +1 , 新的条目的 index 为 1。遍历数组第二个值时, maxId 即遍历上一个元素时的返回值,此时 todo 元素为数组中的第二项,返回值取最大的一个。

<a name="filter" id="filter" >2、filter() </a>

概述

filter() 方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。

语法

array.filter(callback [, thisArg])

参数解释如下:

  • callback:用来测试数组的每个元素的函数,包含三个参数。返回 true 表示保留该元素( 通过测试 ),返回 false 则不保留。
    • currentValue:数组中当前被传递的元素。
    • index:元素的索引。
    • array:被遍历的数组
  • thisArg:执行 callback 时使用的 this 值。非必需。

示例

export default function todos(state = initialState, action) {
  switch (action.type) {
    case DELETE_TODO:
      return state.filter(todo =>
        todo.id !== action.id
      );
    default:
      return state;
  }
}

代码解释:

箭头函数的 todo 参数为当前项元素,箭头后面的判断语句,如果返回 true 则保留当前项,反之则移除当前项。本示例目的为删除一个条目,遍历数组,如果当前项的 id 与要删除条目的 id 不相等时,保留该项,否则删除该项。

<a name="map" id="map" >3、map() </a>

概述

map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

语法

array.map(callback [, thisArg])

参数解释如下:

  • callback:原数组中的元素调用该方法后返回一个新的元素。该方法包含如下三个参数。
    • currentValue:数组中当前被传递的元素。
    • index:元素的索引。
    • array:被遍历的数组
  • thisArg:执行 callback 时使用的 this 值。非必需。

示例

export default function todos(state = initialState, action) {
  switch (action.type) {
    case EDIT_TODO:
      return state.map(todo => (
        todo.id === action.id ?
          Object.assign({}, todo, { text: action.text }) :
          todo
      ));
    default:
      return state;
  }
}

代码解释:

本示例目的为修改一个条目的内容,遍历数组,返回值为一个三元运算符,当当前项的 id 与 action.id ( 要操作的项的id ) 相同时,使用 Object.assign() 方法操作其参数,在此处的 Object.assign() 的三个参数中,第一个参数为要返回的目标对象,后面的对象都为源对象,此函数的目的是将后面的所有源对象拷贝到目标对象中,再返回目标对象。此处使用该函数的目的为,如果当前项为要修改的项,此时的 todo 就是该项,然后将其与 { text: action.text } 拷贝到 {} 中,todo 本身的 text 属性则会被 { text: action.text } 中的 action.text 所覆盖,此时就起到了修改的作用。如果当前项不是要修改的项,则原样返回 。

<a name="every" id="every" >4、every() </a>

概述

every() 方法用于测试数组中所有元素是否都通过了指定函数的测试。

语法

array.every(callback [, thisArg])

参数解释如下:

  • callback:用来测试每个元素的函数。
    • currentValue:数组中当前被传递的元素。
    • index:元素的索引。
    • array:被遍历的数组
  • thisArg:执行 callback 时使用的 this 值。非必需。

示例

const areAllMarked = state.every(todo => todo.completed)

代码解释:

本示例目的为检查是否所有条目的 completed 属性均为 true,如果是的话,则返回 true,否则返回 false 。

<a name="some" id="some" >5、some() </a>

概述

some() 方法用于测试数组中是否至少有一项元素通过了指定函数的测试。

语法

array.some(callback [, thisArg])

参数解释如下:

  • callback:用来测试每个元素的函数。
    • currentValue:数组中当前被传递的元素。
    • index:元素的索引。
    • array:被遍历的数组
  • thisArg:执行 callback 时使用的 this 值。非必需。

示例

const atLeastOneMarked = state.some(todo => todo.completed)

代码解释:

本示例目的为检查是否至少有一个条目的 completed 属性均为 true,如果是的话,则返回 true,否则返回 false 。

<a name="six" id="six" >6、展开运算符</a>

概述

展开运算符允许一个表达式在某处展开。常用的场景包括:函数参数、数组元素、解构赋值。另外,JSX中的组件 props 也可以使用展开运算符来赋值。

语法

// 用于函数参数:
myFunction(...iterableObj);

// 用于数组元素:
[...iterableObj, 4, 5, 6];

// 用于解构赋值:
const [ a, b, ...rest ] = [ 1, 2, 3, 4, 5 ];
const { a, b, ...rest } = { a: 1, b: 2, c: 3, d: 4 };

// 用于 React 组件的 props:
<App ...iterableObj />

示例一

return [
        {
          id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1,
          completed: false,
          text: action.text,
        },
        ...state,
      ];

代码解释:

展开 state 数组的每一项到当前的数组。

示例二

<TodoItem key = {todo.id} todo = {todo} {...action} />

展开 actions 中的每一个属性到组件中。

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

推荐阅读更多精彩内容