方法列表

every

every 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个 boolean

如果回调函数的每一次返回都为 truthy 值,返回 true,否则返回 false

参数说明

every 参数
  1. every (
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return boolean
参数名 是否必填 类型 说明
callback funciton 用来测试每个元素的函数,它可以接收三个参数
thisArg ThisType 执行 callback 时使用的 this

callback 参数
  1. function callback<T>(
  2. element: T,
  3. index: number,
  4. array: Array<T>,
  5. ) return boolean
参数名 是否必填 类型 说明
element T 用于测试的当前值
index number 用于测试的当前值的索引
array Array 调用 every的当前数组

示例

  1. // 检测数组中的所有元素是否都大于 10。
  2. function isBigEnough(element, index, array) {
  3. return element >= 10
  4. }
  5. [12, 5, 8, 130, 44].every(isBigEnough) // false
  6. [12, 54, 18, 130, 44].every(isBigEnough) // true
  7. // 箭头函数为上面的检测过程提供了更简短的语法。
  8. [12, 5, 8, 130, 44].every(x => x >= 10) // false
  9. [12, 54, 18, 130, 44].every(x => x >= 10) // true

filter

filter 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素

那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。

filter 不会改变原数组,它返回过滤后的新数组。

参数说明

filter 参数
  1. filter(
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return boolean
参数名 是否必填 类型 说明
callback funciton 用来测试数组的每个元素的函数。返回 true表示该元素通过测试,保留该元素,false则不保留
thisArg ThisType 执行 callback时使用的 this

callback 参数
  1. callback<T>(
  2. element: T,
  3. index: number,
  4. array: Array<T>,
  5. ) return boolean
参数名 是否必填 类型 说明
element T 用于测试的当前值
index number 用于测试的当前值的索引
array Array 调用了 filter 的数组本身。

示例

  1. // 筛选排除所有较小的值
  2. function isBigEnough(element) {
  3. return element >= 10
  4. }
  5. var filtered = [12, 5, 8, 130, 44].filter(isBigEnough)
  6. console.log(filtered) // [12, 130, 44]

巧用

简单 boolean 值的简写

  1. // 如果只需要判断一些简单的boolean值 则可以直接简写为
  2. const arr = ['filter', '', 1, 0, true, false, undefined, null]
  3. console.log(arr.filter(Boolean)) // ['filter', 1, true]
  4. console.log(arr.filter(element => element)) // ['filter', 1, true]

find

find 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined

find 方法对数组中的每一项元素执行一次 callback 函数,直至有一个 callback 返回 true。当找到了这样一个元素后,该方法会立即返回这个元素的值,否则返回 undefined

对于稀松数组来说,依然会遍历空项,传入的值则为 undefined

参数说明

find 参数
  1. find (
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return T | undefined
参数名 是否必填 类型 说明
callback funciton 用来测试数组的每个元素的函数。如果返回为 true表示该元素通过测试,直接返回该元素。如果没有任何元素返回 true ,则返回 undefined
thisArg ThisType 执行 callback 时使用的 this

callback 参数
  1. function callback<T>(
  2. element: T,
  3. index: number,
  4. array: Array<T>,
  5. ) return boolean
参数名 是否必填 类型 说明
element T 当前遍历到的元素
index number 用于测试的当前值的索引
array Array 调用了 find的数组本身。

示例

  1. // 用对象的属性查找数组里的对象
  2. const inventory = [
  3. {name: 'apples', quantity: 2},
  4. {name: 'bananas', quantity: 0},
  5. {name: 'cherries', quantity: 5}
  6. ]
  7. function isCherries(fruit) {
  8. return fruit.name === 'cherries'
  9. }
  10. console.log(inventory.find(isCherries)) // { name: 'cherries', quantity: 5 }
  11. // 稀松数组
  12. const arr = [, , , , 1]
  13. arr.find(item => console.log(item)) // 1
  14. /**
  15. * console.log(item)
  16. * undefined
  17. * undefined
  18. * undefined
  19. * undefined
  20. * 1
  21. */

findIndex

同使用方法同 find ,但返回是通过测试的下标,若没有找到对应元素则返回-1。

示例

  1. // 查找数组中首个质数元素的索引
  2. function isPrime(element, index, array) {
  3. var start = 2
  4. while (start <= Math.sqrt(element)) {
  5. if (element % start++ < 1) {
  6. return false
  7. }
  8. }
  9. return element > 1
  10. }
  11. console.log([4, 6, 8, 12].findIndex(isPrime)) // -1, not found
  12. console.log([4, 6, 7, 12].findIndex(isPrime)) // 2

forEach

forEach 方法对数组的每个元素执行一次给定的函数。

forEach 方法按升序为数组中含有效值的每一项执行一次 callback 函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上)。

参数说明

forEach 参数
  1. forEach (
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return undefined
参数名 是否必填 类型 说明
callback funciton 为数组中每个元素执行的函数,该函数接收一至三个参数
thisArg ThisType 执行 callback时使用的 this

callback 参数
  1. function callback<T>(
  2. element: T,
  3. index: number,
  4. array: Array<T>,
  5. ) return undefined
参数名 是否必填 类型 说明
element T 数组中正在处理的当前元素。
index number 数组中正在处理的当前元素的索引。
array Array 调用了 forEach的数组本身。

示例

  1. // 不对未初始化的值进行任何操作(稀疏数组)
  2. const arraySparse = [1, 3, , 7]
  3. let numCallbackRuns = 0
  4. arraySparse.forEach(function (element) {
  5. console.log(element)
  6. numCallbackRuns++
  7. })
  8. console.log("numCallbackRuns: ", numCallbackRuns)
  9. // 1
  10. // 3
  11. // 7
  12. // numCallbackRuns: 3
  13. // 如果数组在迭代时被修改了,则其他元素会被跳过。
  14. var words = ['one', 'two', 'three', 'four']
  15. words.forEach(function(word) {
  16. console.log(word)
  17. if (word === 'two') {
  18. words.shift()
  19. }
  20. })
  21. // one
  22. // two
  23. // four
  24. // 如果使用 promise 或 async 函数作为 forEach() 等类似方法的 callback 参数,最好对造成的执行顺序影响多加考虑,否则容易出现错误。
  25. let ratings = [5, 4, 5]
  26. let sum = 0
  27. let sumFunction = async function (a, b) {
  28. return a + b
  29. }
  30. ratings.forEach(async function (rating) {
  31. sum = await sumFunction(sum, rating)
  32. })
  33. console.log(sum) // 0

map

map 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。

map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用。

参数说明

map 参数
  1. map (
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return // 修改过后的新数组
参数名 是否必填 类型 说明
callback funciton 为数组中每个元素执行的函数,该函数接收一至三个参数
thisArg ThisType 执行 callback时使用的 this

callback 参数
  1. function callback<T>(
  2. element: T,
  3. index: number,
  4. array: Array<T>,
  5. ) return // 一个由原数组每个元素执行回调函数的结果组成的新数组
参数名 是否必填 类型 说明
element T callback 数组中正在处理的当前元素。
index number 数组中正在处理的当前元素的索引。
array Array 调用了 map 的数组本身。

示例

  1. // 求数组中每个元素的平方根
  2. var numbers = [1, 4, 9]
  3. var roots = numbers.map(Math.sqrt)
  4. console.log(numbers) // [1, 4, 9]
  5. console.log(roots) // [1, 2, 3]
  6. // 当返回 undefined 或没有返回任何内容时
  7. var numbers = [1, 2, 3, 4]
  8. var filteredNumbers = numbers.map(function(num, index) {
  9. if(index < 3) {
  10. return num
  11. }
  12. })
  13. console.log(filteredNumbers) // [1, 2, 3, undefined]

reduce

reduce 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

第一次执行回调函数时,不存在“上一次的计算结果”。如果需要回调函数从数组索引为 0 的元素开始执行,则需要传递初始值。否则,数组索引为 0 的元素将被作为初始值 initialValue,迭代器将从第二个元素开始执行(索引为 1 而不是 0)。

参数说明

reduce 参数
  1. reduce (
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return // 使用 callback 函数遍历整个数组处理后的结果
参数名 是否必填 类型 说明
callback funciton 为数组中每个元素执行的函数
initialValue any 为第一次调用 callback 函数时参数 previousValue 的值。若指定了初始值
initialValue,则 currentValue 则将使用数组第一个元素;否则 previousValue 将使用数组第一个元素,而 currentValue 将使用数组第二个元素。

callback 参数
  1. function callback<T>(
  2. previousValue: T,
  3. currentValue: T,
  4. currentIndex: number,
  5. array: Array<T>,
  6. ) return any // 一个由原数组每个元素执行回调函数的结果组成的新数组
参数名 是否必填 类型 说明
previousValue any 上一次调用 callbackFn 时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为
initialValue,否则为数组索引为 0 的元素 array[0]
currentValue any 数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,其值则为数组索引为 0 的元素
array[0],否则为 array[1]
currentIndex number 数组中正在处理的元素的索引。若指定了初始值 initialValue,则起始索引号为 0,否则从索引 1 起始。
array Array 用于遍历的数组

示例

  1. // 计算数组中每个元素出现的次数 (使用初始值)
  2. let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']
  3. let countedNames = names.reduce(function (allNames, name) {
  4. if (name in allNames) {
  5. allNames[name]++
  6. }
  7. else {
  8. allNames[name] = 1
  9. }
  10. return allNames
  11. }, {})
  12. console.log(countedNames) // { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
  13. // 实现一个累加器 (不使用初始值)
  14. let sum = [0, 1, 2, 3].reduce(function (previousValue, currentValue) {
  15. return previousValue + currentValue
  16. })
  17. console.log(sum) // 6

reduceRight

reduceRight 方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。

使用方法同 reduce

some

some 方法测试数组中是不是至少有 1 个元素通过了被提供的函数测试。它返回的是一个 Boolean 类型的值。

参数说明

some 参数
  1. some (
  2. callback: function,
  3. thisArg: ThisType,
  4. ) return boolean
参数名 是否必填 类型 说明
callback funciton 用来测试每个元素的函数
thisArg ThisType 执行 callback时使用的 this

callback 参数
  1. function callback<T>(
  2. element: T,
  3. index: number,
  4. array: Array<T>,
  5. ) return any // 一个由原数组每个元素执行回调函数的结果组成的新数组
参数名 是否必填 类型 说明
element T 数组中正在处理的元素
index number 数组中正在处理的元素的索引值
array Array some() 被调用的数组

示例

  1. // 检测在数组中是否有元素大于 10。
  2. function isBiggerThan10(element, index, array) {
  3. return element > 10
  4. }
  5. [2, 5, 8, 1, 4].some(isBiggerThan10) // false
  6. [12, 5, 8, 1, 4].some(isBiggerThan10) // true

sort

sort 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的

注意! 此方法会改变原数组

如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的 Unicode 位点进行排序。

如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

参数说明

some 参数
  1. some (
  2. compareFunction: function | undefined,
  3. ) return array // 排序后的原数组
参数名 是否必填 类型 说明
compareFunction funciton 用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的 Unicode 位点进行排序。

compareFunction 参数
  1. function compareFunction<T>(
  2. firstElemebt: T,
  3. secondElemebt: T,
  4. ) return number
参数名 是否必填 类型 说明
firstElemebt T 第一个用于比较的元素
secondElemebt T 第二个用于比较的元素

示例

  1. // 数字数组简单排序
  2. var numbers = [4, 2, 5, 1, 3]
  3. numbers.sort(function(a, b) {
  4. return a - b
  5. })
  6. console.log(numbers) // [1, 2, 3, 4, 5]
  7. // 也可以写成:
  8. var numbers = [4, 2, 5, 1, 3]
  9. numbers.sort((a, b) => a - b)
  10. console.log(numbers) // [1, 2, 3, 4, 5]
  11. // 对象数组的排序
  12. var items = [
  13. { name: 'Edward', value: 21 },
  14. { name: 'Sharpe', value: 37 },
  15. { name: 'And', value: 45 },
  16. { name: 'The', value: -12 },
  17. { name: 'Magnetic', value: 0 },
  18. { name: 'Zeros', value: 37 }
  19. ]
  20. items.sort(function (a, b) { // 根据 value 排序
  21. return (a.value - b.value)
  22. })
  23. console.log(JSON.stringify(items))
  24. /**
  25. * [
  26. * { name: 'The', value: -12 }
  27. * { name: 'Edward', value: 21 }
  28. * { name: 'Sharpe', value: 37 }
  29. * { name: 'And', value: 45 }
  30. * { name: 'Magnetic', value: 0 }
  31. * { name: 'Zeros', value: 37 }
  32. * ]
  33. */
  34. items.sort(function (a, b) { // 根据 name 排序
  35. var nameA = a.name.toUpperCase() // ignore upper and lowercase
  36. var nameB = b.name.toUpperCase() // ignore upper and lowercase
  37. if (nameA < nameB) {
  38. return -1
  39. }
  40. if (nameA > nameB) {
  41. return 1
  42. }
  43. // names must be equal
  44. return 0
  45. })
  46. console.log(JSON.stringify(items))
  47. /**
  48. * [
  49. * { name: 'And', value: 45 }
  50. * { name: 'Edward', value: 21 }
  51. * { name: 'Magnetic', value: 0 }
  52. * { name: 'Sharpe', value: 37 }
  53. * { name: 'The', value: -12 }
  54. * { name: 'Zeros', value: 37 }
  55. * ]
  56. */

巧用

  1. // sort 也可以用来打乱数组
  2. function radomNumber() {
  3. return Math.random() - 0.5
  4. }
  5. const arr = [1, 2, 3, 4, 5, 6, 7, 8]
  6. arr.sort(radomNumber)
  7. console.log(arr) // [7, 1, 5, 4, 2, 6, 8, 3] 随机数组,每次输出都不一样