JavaScript数组结构与算法——数组详解(中)

迭代器方法

在上篇中,我们探讨了很多数组方法,接下来总结一下最后一组方法——迭代器方法。这些方法对数组的每个元素应用一个函数,可以返回一个值、一组值、或者一个新数组。

1、不生成新数组的迭代器方法

以下这组迭代器方法不产生任何新数组,它们要么对数组中的每个元素执行某种操作,要么返回一个值。

1.1 forEach()

此方法接受一个函数作为参数,对数组中的每个元素使用该函数。

    function square(num) {
        console.log(num + '的平方为: ' + num * num)
    }
    var nums = [1, 2, 3, 4, 5]
    nums.forEach(square)

以上方法用于求数组nums中每个元素的平方,运行结果如下:

JavaScript数组结构与算法——数组详解(中)_第1张图片

1.2 every()

此方法接受一个返回值为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。运行结果如下:

JavaScript数组结构与算法——数组详解(中)_第2张图片

1.3 some()

此方法与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('此数组中没有奇数')
    }

以上代码判断了数组元素中是否存在奇数,输出结果为“此方法中有奇数”。

1.4 reduce()

此方法接受一个函数,从一个累加值开始,不断地对累加值和数组中的后续元素调用该函数,直到数组的最后一个元素,最后返回得到的累加值。以下为使用reduce()求数组中元素和的例子。

    function add(total, num) {
        return total + num
    }
    var array = [1, 2, 3, 4, 5]
    var odd = array.reduce(add)
    console.log(odd)

结果如下:

JavaScript数组结构与算法——数组详解(中)_第3张图片

注意:假如数组长度为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)

结果:

JavaScript数组结构与算法——数组详解(中)_第4张图片

(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)

结果:

JavaScript数组结构与算法——数组详解(中)_第5张图片

2、生成新数组的迭代器方法

有两个迭代器方法可以产生新数组,map()与filter()。

2.1 map()

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)
JavaScript数组结构与算法——数组详解(中)_第6张图片

对字符数组也可以使用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(''))

运行结果:

JavaScript数组结构与算法——数组详解(中)_第7张图片

2.2 filter()

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)

运行结果:

JavaScript数组结构与算法——数组详解(中)_第8张图片

2.3 filter()的应用例子。

(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))

结果:

JavaScript数组结构与算法——数组详解(中)_第9张图片

(2)过滤掉无"love"的元素。

    function pass(word) {
        return word.indexOf('love') !== -1
    }
    var array = ['loveFamily', 'loveFriends', 'loveLearning', '哈哈哈啊哈哈']
    var love = array.filter(pass)
    console.log(love)

运行结果:

JavaScript数组结构与算法——数组详解(中)_第10张图片

JavaScript数据结构与算法——数组详解(中)完结~

剩余内容(二维数组与多维数组)将在下篇总结。

以上总结如存在不正确的地方,欢迎指出O(∩_∩)O~~~

周末愉快!!

你可能感兴趣的:(JS数据结构与算法,JavaScript)