在上篇中,我们探讨了很多数组方法,接下来总结一下最后一组方法——迭代器方法。这些方法对数组的每个元素应用一个函数,可以返回一个值、一组值、或者一个新数组。
以下这组迭代器方法不产生任何新数组,它们要么对数组中的每个元素执行某种操作,要么返回一个值。
此方法接受一个函数作为参数,对数组中的每个元素使用该函数。
function square(num) {
console.log(num + '的平方为: ' + num * num)
}
var nums = [1, 2, 3, 4, 5]
nums.forEach(square)
以上方法用于求数组nums中每个元素的平方,运行结果如下:
此方法接受一个返回值为boolean类型的函数,对数组中的每个元素使用该函数,该函数返回值全部为true的话,every()才会返回true,否则返回false。
function isOdd(num) {
return num % 2 !== 0
}
var array = [1, 2, 3, 4, 5]
var odd = array.every(isOdd)
if(odd) {
console.log('此数组中所有元素都为奇数')
} else {
console.log('此数组中并非所有元素为奇数')
}
以上代码中,将用户判断元素是否是奇数的函数作为参数传给every(),当调用every()的数组中元素全部为奇数时,返回值为true,否则为false。运行结果如下:
此方法与every()类似,区别在于传给some()的函数中,只要有一个返回true,此方法就返回true。
简单测试一下:
function hasOdd(num) {
return num % 2 !== 0
}
var array = [1, 2, 3, 4, 5]
var odd = array.some(hasOdd)
if(odd) {
console.log('此数组中有奇数')
} else {
console.log('此数组中没有奇数')
}
以上代码判断了数组元素中是否存在奇数,输出结果为“此方法中有奇数”。
此方法接受一个函数,从一个累加值开始,不断地对累加值和数组中的后续元素调用该函数,直到数组的最后一个元素,最后返回得到的累加值。以下为使用reduce()求数组中元素和的例子。
function add(total, num) {
return total + num
}
var array = [1, 2, 3, 4, 5]
var odd = array.reduce(add)
console.log(odd)
结果如下:
注意:假如数组长度为1的话,array.reduce(add)并不会调用add(),而是直接返回该元素值。测试:
function add(total, num) {
console.log('total'+ total)
console.log('num' + num)
return total + num
}
var array = [1]
var odd = array.reduce(add)
console.log(odd)
以上代码直接输出1,add()方法中的两个log都不会执行,即:没有调用add()。
除了求和,reduce()还可以用于将数组元素连接成字符串。
function connect(string, item) {
return string + ' ' + item
}
var array = ['I', 'am', 'a', 'developer', 'from', 'guangzhou']
var sentence = array.reduce(connect)
console.log(sentence)
结果:
(5)reduceRight()
此方法与reduce()类似,区别在于执行顺序相反,reduce()为从左到右,此方法为从右到左。可以对以上代码修改一下作为测试:
function connect(string, item) {
return string + ' ' + item
}
var array = ['I', 'am', 'a', 'developer', 'from', 'guangzhou']
var sentence = array.reduceRight(connect)
console.log(sentence)
结果:
有两个迭代器方法可以产生新数组,map()与filter()。
map()与forEach()有点像,都是每个数组元素应用某个函数,区别在于map()返回一个新的数组,该数组的元素是对原数组应用某个函数后的结果。对forEach()中的例子做一下修改:
function square(num) {
return num * num
}
var nums = [1, 2, 3, 4, 5]
var newArr = nums.map(square)
console.log(newArr)
对字符数组也可以使用map(),原理跟数字的一样的,假如有一个数组['54321', '23456', '01234'],如何截出520?
这个需求就可以使用map()轻松实现:
function connect(str) {
return str[0]
}
var array = ['54321', '23456', '01234']
var newArr = array.map(connect)
console.log('哈哈哈: ' + newArr.join(''))
运行结果:
filter()与every()类似,传入一个返回值为boolean类型的函数。不同的是,对数组中的所有元素使用传入的方法,结果均为true时,该方法并不返回true,而是返回一个新数组,该数组包含原数组中应用该函数后结果为true的元素。举个例子:
function isOdd(num) {
return num % 2 !== 0
}
function isEven(num) {
return num % 2 == 0
}
var nums = [1, 2, 3, 4, 5]
var oddArr = nums.filter(isOdd)
var evenArr = nums.filter(isEven)
console.log('oddArr: ' + oddArr)
console.log('evenArr: ' + evenArr)
运行结果:
(1)求及格的分数集,并对及格的所有分数进行求均值。
function pass(score) {
return score >= 60
}
var grades = [11, 33, 55, 66, 77, 57, 90, 59, 100]
var passArr = grades.filter(pass)
// 及格的所有分数
console.log(passArr)
// 及格分数的平均值
var sum = 0, arrLength = passArr.length;
for (var i = 0; i < arrLength; i++) {
sum += passArr[i]
}
console.log(parseFloat(sum / arrLength))
结果:
(2)过滤掉无"love"的元素。
function pass(word) {
return word.indexOf('love') !== -1
}
var array = ['loveFamily', 'loveFriends', 'loveLearning', '哈哈哈啊哈哈']
var love = array.filter(pass)
console.log(love)
运行结果:
JavaScript数据结构与算法——数组详解(中)完结~
剩余内容(二维数组与多维数组)将在下篇总结。
以上总结如存在不正确的地方,欢迎指出O(∩_∩)O~~~
周末愉快!!