數組的5個迭代方法: every(); //對數組中的每一項運行給定函數,如果該函數對每一項都返回true,則返回true; filter(); //對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組; forEach(); //對數組中的每一項運行給定函數,這個方法沒有返回值;
數組的5個迭代方法:
every(); //對數組中的每一項運行給定函數,如果該函數對每一項都返回true,則返回true; filter(); //對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組; forEach(); //對數組中的每一項運行給定函數,這個方法沒有返回值; map(); //對數組中的每一項運行給定函數,返回函數每次調用的結果組成的數組; some(); //對數組中的每一項運行給定函數,如果該函數對任一項返回true,則返回true。
*:以上方法都不會修改數組中包含的值!
每個方法都接受兩個參數,要在每一項上運行的函數和運行該函數的作用域對象(可選、影響this的值)
傳入的函數會接受三個參數:數組項的值、該項在數組中的位置以及數組對象本身。
以map()為例:array1.map(callback[,thisArg])
array1:必需,一個數組對象
callbackfn:必需,一個接受最多三個參數的函數,對於數組中的每個元素,,map都會調用callbackfn一次
thisArg:可選,可在callbackfn中為其引用this關鍵字的對象,如果省略,則undefined將用作this的值。
[“1”,“2”,“3”].map(parseInt)的運行結果是------------[1,NaN,NaN]
parseInt 需要兩個參數(val,radix),而map()傳遞了三個參數:(element,index,array)在這裡map函數將數組的索引傳遞給了第二個參數。
荔枝:寫一個函數,要求傳入一個字元串,統計其中a-z的字母(大小寫均算),若字元串中存在這個英文字母,則在函數返回的長為26的字元串中的相應位置輸出1(按a-z的順序)比如說輸入'a **& bZ',輸出'11000000000000000000000001'【例子都是codewars上的- -解釋能力不行說不太明白】
function change(string) { string = string.toLowerCase() return 'abcdefghijklmnopqrstuvwxyz'.split('').map(function (c) { return string.indexOf(c) !== -1 ? 1 : 0; }).join(''); }
荔枝2: 返回數組中某一項的數量
//比如說
var arr = [0,1,2,2,3]; arr.numberOfOccurrences(0) === 1; arr.numberOfOccurrences(4) === 0; arr.numberOfOccurrences(2) === 2; arr.numberOfOccurrences("a") === 0;
//使用filter()解決: Array.prototype.numberOfOccurrences = function(search) { return this.filter( function(num){ return search === num } ).length; }
荔枝3:toWeirdCase()函數,接受一個字元串參數(英文字元,如“Weird string case”,“String”,若有多個單詞則中間用一個空格隔開),這個函數要求輸出一個字元串:其中的每個單詞中位數為奇數的為大寫,其餘小寫。
//#1 function toWeirdCase(string) { function singleWeird(e) { var word = e.split(''); for (var i = 0; i < word.length; i += 2) { word[i] = word[i].toUpperCase(); } return word.join(''); } return string.split(' ').map(function (e) { return singleWeird(e); }).join(' '); } //#2 function toWeirdCase(string){ return string.split(' ').map(function(word){ return word.split('').map(function(letter, index){ return index % 2 == 0 ? letter.toUpperCase() : letter.toLowerCase() }).join(''); }).join(' '); } //#3: function toWeirdCaseCharacter(chr, index) { return index % 2 ? chr.toLowerCase() : chr.toUpperCase(); } function toWeirdCaseWord(word){ return word.split("").map(toWeirdCaseCharacter).join(""); } function toWeirdCase(string){ return string.split(" ").map(toWeirdCaseWord).join(" "); } //正則: function toWeirdCase(string){ return string.replace(/(\b(\S)*\b)/g, function(v,i){ return v.split("").map(function(v, i) { return (i%2 == 0) ? v.toUpperCase(): v}).join("") }) }
ECMAScript5新增了兩個歸併數組的方法:reduce()和reduceRight()。這兩個方法都會迭代數組的所有項,然後構建一個最終返回的值(對數組中的所有元素調用指定的回調函數。 該回調函數的返回值為累積結果,並且此返回值在下一次調用該回調函數時作為參數提供。)。
其中reduce()從數組的第一項開始而reduceRight()則從最後一項開始往前遍歷。
以reduce();為例:
array1.reduce(callbackfn[, initialValue]) //array1:【必需】 一個數組對象 //callbackfn:【必需】 一個接受最多四個參數的函數。 對於數組中的每個元素,reduce 方法都會調用 callbackfn 函數一次。 //initialValue:【可選】 如果指定 initialValue,則它將用作初始值來啟動累積。 第一次調用 callbackfn 函數會將此值作為參數而非數組值提供
//返回值:通過最後一次調用回調函數獲得的累積結果。
//如果提供了 initialValue,則 reduce 方法會對數組中的每個元素調用一次 callbackfn 函數(按升序索引順序)。 如果未提供 initialValue,則 reduce 方法會對從第二個元素//開始的每個元素調用 callbackfn 函數。(reduceRight()的處理順序相反)
//回調函數的返回值在下一次調用回調函數時作為 previousValue 參數提供。 最後一次調用回調函數獲得的返回值為 reduce 方法的返回值。
回調函數: function callbackfn(previousValue, currentValue, currentIndex, array1) //可使用最多四個參數來聲明回調函數。
//【previousValue】:通過上一次調用回調函數獲得的值。 如果向 reduce 方法提供initialValue,則在首次調用函數時,previousValue 為 initialValue。
//【currentValue】:當前數組元素的值。
//【currentIndex】:當前數組元素的數字索引。
//【array1】:包含該元素的數組對象。
在第一次調用回調函數時,作為參數提供的值取決於 reduce 方法是否具有 initialValue 參數。
如果向 reduce 方法提供 initialValue:
-
-
previousValue 參數為 initialValue。
-
currentValue 參數是數組中的第一個元素的值。
-
如果未提供 initialValue:
-
-
previousValue 參數是數組中的第一個元素的值。
-
currentValue 參數是數組中的第二個元素的值。
-
荔枝:向一個函數傳入一個String,函數返回包含字元串中大寫字母所在位置的數組:
var capitals = function (word) { return word.split('').reduce(function(memo, v, i) { return v === v.toUpperCase() ? memo.concat(i) : memo; }, []); };