javascript
JavaScript数组结构与算法——数组详解(中)
迭代器方法
在上篇中,我們探討了很多數組方法,接下來總結一下最后一組方法——迭代器方法。這些方法對數組的每個元素應用一個函數,可以返回一個值、一組值、或者一個新數組。
1、不生成新數組的迭代器方法
以下這組迭代器方法不產生任何新數組,它們要么對數組中的每個元素執行某種操作,要么返回一個值。
1.1 forEach()
此方法接受一個函數作為參數,對數組中的每個元素使用該函數。
function square(num) {console.log(num + '的平方為: ' + num * num)}var nums = [1, 2, 3, 4, 5]nums.forEach(square)以上方法用于求數組nums中每個元素的平方,運行結果如下:
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。運行結果如下:
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)結果如下:
注意:假如數組長度為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)結果:
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)對字符數組也可以使用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(''))運行結果:
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)運行結果:
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))結果:
(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~~~
周末愉快!!
總結
以上是生活随笔為你收集整理的JavaScript数组结构与算法——数组详解(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 里约热内卢是哪个国家
- 下一篇: JavaScript数据结构与算法——数