js 数组常用的遍历方法总结

forEach()

语法:

arr.forEach(callback(currentValue [, index [, array]])[, thisArg])
  • callback: 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • currentValue 数组中正在处理的当前元素。
    • index 数组中正在处理的当前元素的索引。
    • array forEach() 方法正在操作的数组。
  • thisArg 可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 返回值:undefined(没有返回值)

特点:

  1. forEach() 遍历的范围在第一次调用 callback 前就会确定。调用 forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach() 遍历到他们那一刻的值。已删除的项不会被遍历到。如果已访问的元素在迭代时被删除了(例如使用 shift()),之后的元素将被跳过
  2. forEach() 为每个数组元素执行一次 callback 函数;
  3. 总会返回undefined值(不反回新的数组)
  4. forEach() 被调用时,不会改变原数组,也就是调用它的数组(尽管 callback 函数在被调用时可能会改变原数组)。
  5. 除了抛出异常以外,没有办法中止或跳出 forEach() 循环。如果你需要中止或跳出循环,forEach() 方法不是应当使用的工具。

eg:

let arr = ['one', 'two', 'three'];
arr.forEach((item, index, array) => {
    console.log(`数组中正在处理的当前元素: ${item}`)
    console.log(`数组中正在处理的当前元素的索引: ${index}`)
    console.log(`forEach() 方法正在操作的数组:  ${array}`)
})

map()

语法:

var new_array = arr.map(callback(currentValue[, index[, array]]) {
    Return element for new_array 
}[, thisArg])
  • callback 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • currentValue 数组中正在处理的当前元素。
    • index 数组中正在处理的当前元素的索引。
    • array 调用了 map() 的数组本身。
  • thisArg 可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 返回值:一个新的数组

特点:

  1. map 方法处理数组元素的范围是在 callback 方法第一次调用之前就已经确定了。调用map方法之后追加的数组元素不会被callback访问。如果存在的数组元素改变了,那么传给callback的值是map访问该元素时的值。在map函数调用后但在访问该元素前,该元素被删除的话,则无法被访问到。
  2. map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
  3. map 不修改调用它的原数组本身(当然可以在 callback 执行时改变原数组)
  4. 调用后会返回一个新的数组

eg:

let arr = [1, 2, 3, 4, 5];
let newArr = arr.map((item, index, array) => item * 10);
console.log(arr)          //[1, 2, 3, 4, 5]
console.log(newArr)    //[10, 20, 30, 40, 50]

filter() 过滤器

语法:

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
  • callback 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • element 数组中正在处理的当前元素。
    • index 数组中正在处理的当前元素的索引。
    • array 调用了 filter() 的数组本身。
  • thisArg 可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 返回值:一个新的数组

特点:

  1. filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或等价于 true 的值的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中
  2. filter 不会改变原数组,它返回过滤后的新数组。
  3. filter 遍历的元素范围在第一次调用 callback 之前就已经确定了。在调用 filter 之后被添加到数组中的元素不会被 filter 遍历到。如果已经存在的元素被改变了,则他们传入 callback 的值是 filter 遍历到它们那一刻的值。被删除或从来未被赋值的元素不会被遍历到。

eg:

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let newArr = arr.filter((item, index, aray) => item % 2 == 0);
console.log(arr)//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(newArr)//[0, 2, 4, 6, 8, 10]

every()

语法:

arr.every(callback(element[, index[, array]])[, thisArg])
  • callback 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • element 数组中正在处理的当前元素。
    • index 数组中正在处理的当前元素的索引。
    • array 调用 every() 的当前数组。
  • thisArg 可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 返回值:如果回调函数的每一次返回都为 真值,返回 true ,否则返回 false。

特点:

  1. every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个会使 callback 返回 falsy 的元素。如果发现了一个这样的元素,every 方法将会立即返回 false。否则,callback 为每一个元素返回 true,every 就会返回 true。callback 只会为那些已经被赋值的索引调用。不会为那些被删除或从未被赋值的索引调用。
  2. every 不会改变原数组。
  3. every 遍历的元素范围在第一次调用 callback 之前就已确定了。在调用 every 之后添加到数组中的元素不会被 callback 访问到。如果数组中存在的元素被更改,则他们传入 callback 的值是 every 访问到他们那一刻的值。那些被删除的元素或从来未被赋值的元素将不会被访问到
  4. every 和数学中的"所有"类似,当所有的元素都符合条件才会返回true。正因如此,若传入一个空数组,无论如何都会返回 true。(这种情况属于无条件正确:正因为一个空集合没有元素,所以它其中的所有元素都符合给定的条件。)

eg:

let arr = [0, 1, 2, 3, 4, 5, 6]
console.log(arr.every((item, index, array) => item >= 0)) 
//如果都大于等于0 返回true 只要有一个小于0就返回false

some()

语法:

arr.some(callback(element[, index[, array]])[, thisArg])
  • callback 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • element 数组中正在处理的当前元素。
    • index 数组中正在处理的当前元素的索引。
    • array some()被调用的数组。
  • thisArg 可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 返回值:数组中有至少一个元素通过回调函数的测试就会返回true;所有元素都没有通过回调函数的测试返回值才会为false。

特点:

  1. some() 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。如果找到了这样一个值,some() 将会立即返回 true。否则,some() 返回 false。callback 只会在那些”有值“的索引上被调用,不会在那些被删除或从来未被赋值的索引上调用。
  2. some() 被调用时不会改变数组。
  3. 数组中有至少一个元素通过回调函数的测试就会返回true;所有元素都没有通过回调函数的测试返回值才会为false。
  4. some() 遍历的元素的范围在第一次调用 callback. 前就已经确定了。在调用 some() 后被添加到数组中的值不会被 callback 访问到。如果数组中存在且还未被访问到的元素被 callback 改变了,则其传递给 callback 的值是 some() 访问到它那一刻的值。已经被删除的元素不会被访问到。

eg:

let arr = [0, 1, 2, 3, 4, 5, 6]
console.log(arr.some((item, index, array) => item >= 6)) 
//只要数组中有一项满足回调函数中设置的条件就返回true;

reduce() 叠加器

语法:

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
  • callback 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • accumulator 累计器累计回调的返回值; 它是上一次调用回调时返回的累积值。
    • currentValue 数组中正在处理的元素。
    • index 数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始 索引号为0,否则从索引1起始。
    • array some()被调用的数组。
  • initialValue 可选参数。作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
  • 返回值:函数累计处理的结果

特点:

  1. 回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。
  2. 如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
  3. 如果数组为空且没有提供initialValue,会抛出TypeError 。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。
  4. 提供初始值通常更安全
  5. reduce() 被调用时不会改变数组。

eg:

let goodsList = [
    {
        id: 0,
        goods_name: '商品1', //商品名
        goods_num: 1, //商品数量
        goods_much: 300 //商品价格
    },
    {
        id: 1,
        goods_name: '商品2',
        goods_num: 2,
        goods_much: 15
    },
    {
        id: 2,
        goods_name: '商品3',
        goods_num: 3,
        goods_much: 10
    },
    {
        id: 3,
        goods_name: '商品4',
        goods_num: 1,
        goods_much: 100
    },
    {
        id: 4,
        goods_name: '商品5',
        goods_num: 1,
        goods_much: 20
    },
]
let delivery = 3; //配送费
let sum = goodsList.reduce((acc, item) => acc + item.goods_num * item.goods_much, delivery);
console.log(`商品总额加配送费一共:${sum}元`)//商品总额加配送费一共:483元

find()

语法:

arr.find(callback(element[, index[, array]]), thisArg)
  • callback 为数组中每个元素执行的函数,该函数接收一至三个参数:
    • element 数组中正在处理的当前元素。
    • index 数组中正在处理的当前元素的索引。
    • array 数组本身。
  • thisArg 可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 返回值:数组中第一个满足所提供测试函数的元素的值,否则返回 undefined。

特点:

  1. find方法对数组中的每一项元素执行一次 callback 函数,直至有一个 callback 返回 true。当找到了这样一个元素后,该方法会立即返回这个元素的值,否则返回 undefined。
  2. 注意 callback 函数会为数组中的每个索引调用即从 0 到 length - 1,而不仅仅是那些被赋值的索引,这意味着对于稀疏数组来说,该方法的效率要低于那些只遍历有值的索引的方法。
  3. find方法不会改变数组。
  4. 在第一次调用 callback函数时会确定元素的索引范围,因此在 find方法开始执行之后添加到数组的新元素将不会被 callback函数访问到。如果数组中一个尚未被callback函数访问到的元素的值被callback函数所改变,那么当callback函数访问到它时,它的值是将是根据它在数组中的索引所访问到的当前值。被删除的元素仍旧会被访问到,但是其值已经是undefined了。

eg:

let arr = [
    { x: 1 },
    { x: 2 },
    { x: 3 },
    { x: 4 }
]
let obj = arr.find(item => item.x == 2)
console.log(obj)//{x: 2}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容