js中数组的api详解教程二

151 阅读10分钟

数组循环有多种方式,在这里我就不比对那种循环之间的性能比较,纯属就说说它们的用法。

forEach()

forEach方法第一个参数传入一个回调函数,回调函数有三个形参,分别是数组元素,元素下表,元素数组,第二个参数可以传入一个任意类型的值,这个值可以改变第一个参数内部的this指向。返回值是 undefined。

let arr = [1234]let obj = {  name"张三"}

let res = arr.forEach(function(val, index, arr) {
   console.log("数组元素:", val, "元素下标:", index, "原数组:", arr, '改变this指向:'this)
 }, obj)

console.log("返回值: ", res)


// 数组元素: 1 元素下标: 0 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 数组元素: 2 元素下标: 1 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 数组元素: 3 元素下标: 2 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 数组元素: 4 元素下标: 3 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 返回值:  undefined

map()

map方法传入一个回调函数,回调函数有三个形参,分别是数组元素,元素下表,元素数组,第二个参数可以传入一个任意类型的值,这个值可以改变第一个参数内部的this指向。返回值是一个新的数组。

let arr = [1234]let obj = {  name"张三"}

let res = arr.map(function(val, index, arr) {
  console.log("数组元素:", val, "元素下标:", index, "原数组:", arr, "改变this指向:"this)
  return val + 1
}, obj)

console.log("返回一个新的数组: ", res, "原数组:", arr)

// 数组元素: 1 元素下标: 0 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 数组元素: 2 元素下标: 1 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 数组元素: 3 元素下标: 2 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 数组元素: 4 元素下标: 3 原数组: [ 1, 2, 3, 4 ] 改变this指向: { name: '张三' }
// 返回一个新的数组:  [ 2, 3, 4, 5 ] 原数组: [ 1, 2, 3, 4 ]

filter()

filter方法传入一个回调函数,回调函数有三个形参,分别是数组元素,元素下表,元素数组,第二个参数可以传入一个任意类型的值,这个值可以改变第一个参数内部的this指向。这个方法可以用于进行过滤筛选。它的返回值是一个过滤后的数组。

let arr = [1234]let obj = {  name"张三"}

let res = arr.filter(function(val, index, arr) {
  console.log("数组元素:", val, "元素下标:", index, "原数组:", arr, "改变this的指向:"this)
  return val < 2
}, obj)

console.log("返回一个过滤后的数组: ", res, "原数组:", arr)
// 数组元素: 1 元素下标: 0 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 数组元素: 2 元素下标: 1 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 数组元素: 3 元素下标: 2 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 数组元素: 4 元素下标: 3 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 返回一个过滤后的数组:  [ 1 ] 原数组: [ 1, 2, 3, 4 ]

every()

every方法传入一个回调函数,回调函数有三个形参,分别是数组元素,元素下表,元素数组,第二个参数可以传入一个任意类型的值,这个值可以改变第一个参数内部的this指向。它的返回值是一个布尔值,如果数组元素都符合回调函数的条件,则返回 true,否则返回false。

let arr = [1234]let obj = {  name"张三"}

let res = arr.every(function(val, index, arr) {
  console.log("数组元素:", val, "元素下标:", index, "原数组:", arr, "改变this的指向:"this)
  return val < 2
}, obj)

console.log("是否数组内部的所有成员都满足回调函数里到条件: ", res, "原数组:", arr)
// 数组元素: 1 元素下标: 0 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 数组元素: 2 元素下标: 1 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 是否数组内部的所有成员都满足回调函数里到条件:  false 原数组: [ 1, 2, 3, 4 ]

some()

every方法传入一个回调函数,回调函数有三个形参,分别是数组元素,元素下表,元素数组,第二个参数可以传入一个任意类型的值,这个值可以改变第一个参数内部的this指向。它的返回值是一个布尔值,如果数组存在元素符合回调函数的条件,则返回 true,否则返回false。

let arr = [1234]
let obj = {  name"张三"}

let res = arr.some(function(val, index, arr) {
  console.log("数组元素:", val, "元素下标:", index, "原数组:", arr, "改变this的指向:"this)
 return val < 2
}, obj)

console.log("是否数组内部的存在成员满足回调函数里到条件: ", res, "原数组:", arr)
// 数组元素: 1 元素下标: 0 原数组: [ 1, 2, 3, 4 ] 改变this的指向: { name: '张三' }
// 是否数组内部的存在成员满足回调函数里到条件:  true 原数组: [ 1, 2, 3, 4 ]

entries()

entries方法不传入任何参数,它返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。可以用for...of... 进行循环

let arr = [1234]

for(let [key, value] of arr.entries()) {
  console.log("数组下标:", key,"数组元素:", value)
}

// 数组下标: 0 数组元素: 1
// 数组下标: 1 数组元素: 2
// 数组下标: 2 数组元素: 3
// 数组下标: 3 数组元素: 4

keys()

keys方法不传入任何参数,它返回一个数组的迭代对象,该对象包含数组的键(key)。可以用for...of... 进行循环

let arr = [1234]

for(let key of arr.keys()) {
  console.log("数组下标:", key)
}

// 数组下标: 0
// 数组下标: 1
// 数组下标: 2
// 数组下标: 3

values()

values方法不传入任何参数,它返回一个数组的迭代对象,该对象包含数组的元素值(value)。可以用for...of... 进行循环

let arr = [1234]

for(let value of arr.values()) {
  console.log("数组元素:", value)
}

// 数组元素: 1
// 数组元素: 2
// 数组元素: 3
// 数组元素: 4

reduce()

reduce方法可以传入两个参数,第一个参数传入的是一个回调函数,回调函数里有四个参数,分别是:total,currentValue, currentIndex, array。 第二个参数传入的是一个初始值。

  • total:上一次累加的值
  • currentValue:当前的元素
  • currentIndex:当前元素的索引
  • array:当前元素所属的数组对象。
let arr = [123456];

let res = arr.reduce((preVal, curVal, curIndex, array) => {
  console.log('上一次累加的值:', preVal, "当前循环的数组元素的值:", curVal, "数组的下标:", curIndex, "原数组:", array)
  return preVal + curVal
}, 10);// 传递给函数的初始值

console.log('数组求和:', res)

// 上一次累加的值: 10 当前循环的数组元素的值: 1 数组的下标: 0 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 11 当前循环的数组元素的值: 2 数组的下标: 1 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 13 当前循环的数组元素的值: 3 数组的下标: 2 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 16 当前循环的数组元素的值: 4 数组的下标: 3 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 20 当前循环的数组元素的值: 5 数组的下标: 4 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 25 当前循环的数组元素的值: 6 数组的下标: 5 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 数组求和: 31

reduceRight()

reduceRight方法的使用跟reduce方法的使用是一样的,只不过从后往前累加,看下面的代码就明白了。


let arr = [123456]

let res = arr.reduceRight((preVal, curVal, curIndex, array) => {
  console.log('上一次累加的值:', preVal, "当前循环的数组元素的值:", curVal, "数组的下标:", curIndex, "原数组:", array)
  return preVal + curVal
}, 10// 传递给函数的初始值
console.log('数组求和:', res)

// 上一次累加的值: 10 当前循环的数组元素的值: 6 数组的下标: 5 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 16 当前循环的数组元素的值: 5 数组的下标: 4 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 21 当前循环的数组元素的值: 4 数组的下标: 3 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 25 当前循环的数组元素的值: 3 数组的下标: 2 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 28 当前循环的数组元素的值: 2 数组的下标: 1 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 上一次累加的值: 30 当前循环的数组元素的值: 1 数组的下标: 0 原数组: [ 1, 2, 3, 4, 5, 6 ]
// 数组求和: 31