聊一聊數(shù)組的map密浑、reduce、foreach等方法

聊聊數(shù)組遍歷方法

JS 數(shù)組的遍歷方法有好幾個(gè):

  • every
  • some
  • filter
  • foreach
  • map
  • reduce

接下來(lái)我們來(lái)一個(gè)個(gè)地交流下镣丑。

every()

arr.every(callback[, thisArg])
返回值:true | false
是否改變?cè)瓟?shù)組:不改變?cè)瓟?shù)組

解析:
every() 方法用來(lái)測(cè)試數(shù)組中的每一項(xiàng)是否都通過(guò)了callback函數(shù)的測(cè)試舔糖;只有全部通過(guò)才返回 true;否則 false莺匠。
本文出現(xiàn)的 callback 沒有特別聲明都是表示包含 element, index, array 三個(gè)參數(shù)的函數(shù)金吗。

例子:

// 檢測(cè)數(shù)組中的所有元素是否都大于或等于100

[].every((ele) => ele >= 100);  // true

[1, 2, 3].every((ele) => ele >= 100);   // false

some()

arr.some(callback[, thisArg])
返回值:true | false
是否改變?cè)瓟?shù)組:不改變

解析:
some() 跟 every() 類似,只是 every 要每一項(xiàng)都通過(guò) callback 才返回 true趣竣,而 some 只要有通過(guò) callback 的就返回 true摇庙;some 為邏輯或,every 為邏輯與遥缕。

例子:

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

filter()

var newArr = arr.filter(callback[, thisArg])
返回值:新數(shù)組
是否改變?cè)瓟?shù)組:不改變?cè)瓟?shù)組

解析:
filter() 方法會(huì)對(duì)數(shù)組中的每一項(xiàng)(首先這項(xiàng)是有值的)進(jìn)行調(diào)用 callback 函數(shù)卫袒,并根據(jù)調(diào)用結(jié)果返回的 true 或 false 來(lái)組建一個(gè)新的數(shù)組(該數(shù)組是原數(shù)組的子集)。
即過(guò)濾单匣,只有符合的(調(diào)用 callback 返回 true 的)才加入到新數(shù)組中夕凝。

例子:

const isBigEnough = value => value >= 10;

let [...spread] = [12, 4, 8, 120, 44];

let filtered = spread.filter(isBigEnough);
// filtered: [12, 120, 44]
// spread: [12, 4, 8, 120, 44]

forEach()

array.forEach(callback[, thisArg])
返回值:undefined
是否改變?cè)瓟?shù)組:改不改變要看 callback

解析:
forEach() 方法按升序?yàn)閿?shù)組中含有效值的每一項(xiàng)執(zhí)行一次 callback 函數(shù),那些已刪除(使用delete方法等情況)或者未初始化的項(xiàng)將被跳過(guò)(但不包括那些值為 undefined 的項(xiàng))(例如在稀疏數(shù)組上)户秤。反正它就是很死板码秉。

例子:

// three 呢?它被跳過(guò)了鸡号,原因是到two時(shí)转砖,使數(shù)組發(fā)生了變化,導(dǎo)致所有剩下的項(xiàng)上移一個(gè)位置鲸伴,所以three被跳過(guò)了
let words = ['one', 'two', 'three', 'four'];

words.forEach((word) => {
    console.log(word);
    if ( word === 'two' ) {
        words.shift();
    }
});
// one
// two
// four

map()

let newArr = arr.map(callback[, thisArg])
返回值:新數(shù)組
是否改變?cè)瓟?shù)組:不改變

解析:
map() 方法就是數(shù)組中的每一項(xiàng)(有值)按順序都調(diào)用一次 callback 函數(shù)府蔗,然后每一項(xiàng)的返回結(jié)果組成一個(gè)新的數(shù)組作為整個(gè)map方法的返回值。

例子:

let str = '12345';
Array.prototype.map.call(str, (x) => x).reverse().join('');
// '54321'

reduce()

arr.reduce(callback[, initialValue])
返回值:callback函數(shù)累計(jì)處理的結(jié)果
是否改變?cè)瓟?shù)組:

解析:
reduce() 方法的 callback 有四個(gè)參數(shù)汞窗,比之前說(shuō)的多了一個(gè)累計(jì)的返回值姓赤;四個(gè)參數(shù):accumulator、currentValue杉辙、currentIndex模捂、array捶朵;initialValue 是用作第一個(gè)調(diào)用 callback 的第一個(gè)參數(shù)的值,默認(rèn)使用數(shù)組中的第一個(gè)元素狂男。

reduce() 方法跟 map 有點(diǎn)相似综看,都是數(shù)組中的每一個(gè)元素(有效值)一次執(zhí)行 callback 函數(shù),多就多在它會(huì)存上上一次 callback 計(jì)算結(jié)果作為下一次的參數(shù)岖食。

如果沒有提供 initialValue红碑, reduce會(huì)從索引1的地方開始執(zhí)行 callback方法,跳過(guò)第一個(gè)索引泡垃。如果提供 initialValue析珊, 從索引0開始

例子:

// 求和
let sum = [0, 1, 2, 3, 4].reduce((prev, curr) => prev + curr, 0);

// 計(jì)算數(shù)組中每個(gè)元素出現(xiàn)的次數(shù)
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

let countedNames = names.reduce((allNames, name) => {
    if ( name in allNames ) {
        allNames[name]++;
    } else {
        allNames[name] = 1;
    }
    return allNames;
}, {});
// countedNames:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }

// 數(shù)組去重
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
    // 主要是排了序
    if ( init.length === 0 || init[init.length - 1] !== current ) {
        init.push(current);
    }
    return init;
}, []);
console.log(result);

參考

MDN Array

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蔑穴,隨后出現(xiàn)的幾起案子忠寻,更是在濱河造成了極大的恐慌,老刑警劉巖存和,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕剃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捐腿,警方通過(guò)查閱死者的電腦和手機(jī)纵朋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茄袖,“玉大人操软,你說(shuō)我怎么就攤上這事∠芟椋” “怎么了聂薪?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)品山。 經(jīng)常有香客問(wèn)我胆建,道長(zhǎng),這世上最難降的妖魔是什么肘交? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮扑馁,結(jié)果婚禮上涯呻,老公的妹妹穿的比我還像新娘。我一直安慰自己腻要,他們只是感情好复罐,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雄家,像睡著了一般效诅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天乱投,我揣著相機(jī)與錄音咽笼,去河邊找鬼。 笑死戚炫,一個(gè)胖子當(dāng)著我的面吹牛剑刑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播双肤,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼施掏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茅糜?” 一聲冷哼從身側(cè)響起七芭,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔑赘,沒想到半個(gè)月后抖苦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡米死,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年锌历,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峦筒。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡究西,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出物喷,到底是詐尸還是另有隱情卤材,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布峦失,位于F島的核電站扇丛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尉辑。R本人自食惡果不足惜帆精,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隧魄。 院中可真熱鬧卓练,春花似錦、人聲如沸购啄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狮含。三九已至顽悼,卻和暖如春曼振,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔚龙。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工冰评, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人府蛇。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓集索,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汇跨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子务荆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容