JavaScript:reduce全局函數(shù)

數(shù)組是有reduce函數(shù)的护昧,求和之類的很方便。一些類數(shù)組對象粗截,比如{score1 : 100, score2 : 90, score3 : 95 }惋耙,不能用reduce函數(shù)函數(shù),不是很方便慈格。所以考慮提供一個reduce全局函數(shù)怠晴。
實現(xiàn)的思路很簡單,就是將對象的屬性遍歷出來浴捆,組成一個數(shù)組蒜田,那么就可以方便地使用reduce函數(shù)了

數(shù)組的reduce函數(shù)

  • reduce() 方法對累加器和數(shù)組中的每個元素 (從左到右)應(yīng)用一個函數(shù),將其減少為單個值选泻。

  • 一次作用數(shù)組的每一個值冲粤,最后返回一個單一值。最經(jīng)典的例子是累加求和页眯。不過實際的應(yīng)用很廣泛梯捕,比如可以拼接字符串,求最大值等等窝撵。

  • 如果函數(shù)參數(shù)不是一個函數(shù)的話傀顾,會出錯。函數(shù)參數(shù)是必選參數(shù)碌奉。

  • 這個變換函數(shù)本身最多提供4個參數(shù)短曾,依次是accumulator寒砖,currentValue,currentIndex嫉拐,array哩都。一般情況下,給2個參數(shù)婉徘,accumulator漠嵌,currentValue

  • 初始值initialValue是一個可選參數(shù)盖呼。在實際使用中儒鹿,大多數(shù)情況下是需要提供的。提供合適的初始值几晤,需要考慮一下挺身。一般情況是0,或者空數(shù)組[]锌仅,空字符串''等等章钾。

  • 一般提倡給初始值initialValue,變換函數(shù)的參數(shù)accumulator一開始就是這個initialValue热芹,然后依次參與迭代運算贱傀,思路比較順。

  • accumulatorinitialValue伊脓,還有最終結(jié)果是相同的類型

  • 如果不給初始值initialValue府寒,那么accumulator一開始是數(shù)組的第1個值,currentValue一開始是數(shù)組的第2個值报腔。這樣株搔,會導(dǎo)致迭代變換次數(shù)比數(shù)組的元素個數(shù)少1,理解上不是很方便纯蛾。
    一般情況纤房,給初始值initialValue,并且注意其格式翻诉,這個決定了最終結(jié)果的格式

  • 最后的結(jié)果炮姨,和初始值initialValue的形式是一樣的。所以期望什么樣的結(jié)果碰煌,就給什么格式的初始值initialValue舒岸,這個要注意。

  • 變換函數(shù)的array參數(shù)就是調(diào)用reduce函數(shù)的這個數(shù)組芦圾,可以改變蛾派,不過強烈建議不要改變數(shù)組。后面兩個參數(shù)currentIndex,array洪乍,如果不是必須梭依,一般不要列出來。

JavaScript數(shù)組的高級用法-reduce和reduceRight詳解

Array.prototype.reduce()

JavaScript中reduce()方法不完全指南

對象屬性的遍歷

  • for...in返回的是可枚舉的屬性典尾,包括自己的屬性以及原型鏈上的屬性。按照類的說法糊探,也就是說會把父類的屬性也枚舉出來钾埂。

  • for...in如果要過濾掉父類的屬性,也就是原型鏈上的屬性忽略掉科平,那么要借助ObjecthasOwnProperty屬性進(jìn)行判斷和過濾

  • Object.keys()相當(dāng)于for...in + hasOwnProperty效果褥紫。只枚舉自己的可枚舉屬性,不管父類的屬性瞪慧。

  • Object.getOwnPropertyNames()只列舉自己的屬性髓考,不會管父類的屬性。不過弃酌,會列出所有的屬性氨菇,不管這個屬性標(biāo)記為可枚舉還是不可枚舉。比如妓湘,數(shù)組對象查蓉,會把length屬性也列舉出來。

  • 這幾個函數(shù)最好用于Object類型榜贴,不要用于數(shù)組豌研。對于數(shù)組,返回的是字符串的0,1,2,3 ...唬党,沒什么實際意義鹃共。

JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的區(qū)別

Object.keys()

Object.getOwnPropertyNames()

for...in

reduce全局函數(shù)

  • 導(dǎo)出單一函數(shù)的方式驶拱,方便使用霜浴。文件名reduce_function.js
// 全局函數(shù),區(qū)別于數(shù)組的reduce()方法
module.exports = function reduceFunction(callback, initialValue, target) {
    // 如果f不是函數(shù)蓝纲,調(diào)用數(shù)組的reduce會報錯
    if ('function' !== typeFunction(callback)) {
        return target;
    }
    const type = typeFunction(target)
    if (type === 'array') {
        return '_' === initialValue           // 判斷是否調(diào)用init參數(shù)
            ? target.reduce(callback)
            : target.reduce(callback, initialValue);
    } else if (type === 'object') {
        // ES7 , chrome瀏覽器已經(jīng)可以用
        // const values = Object.values(target);
        const keys = Object.keys(target);
        const values = keys.map(function (key) {
            return target[key];
        })
        return '_' === initialValue           // 判斷是否調(diào)用init參數(shù)
            ? values.reduce(callback)
            : values.reduce(callback, initialValue);
    } else {
        return target;
    }
}

// private
function typeFunction(object) {
    return Object.prototype.toString.call(object).slice(8, -1).toLowerCase();
}
  • 測試代碼坷随,在同一目錄下,文件名reduce_function_test.js
const reduceFunction = require('./reduce_function.js');
const log = console.log;

// 數(shù)組累加
const items = [10, 120, 1000];
const add = function(previous, current) { 
    return previous + current; 
};
const max = function(previous, current) { 
    return previous > current
        ? previous
        : current;
};
const multiply = function(previous, current) { 
    return previous * current; 
};
const append = function(previous, current) { 
    return previous + '::' + current; 
};

log(items.reduce(add, 0));                  // 1130
log(items.reduce(max, 0));                  // 1000
log(items.reduce(multiply, 1));             // 1200000
log(items.reduce(append));                  // '10::120::1000'
log(reduceFunction(add, 0, items));         // 1130 
log(reduceFunction(max, 0, items));         // 1000 
log(reduceFunction(multiply, 1, items));    // 1200000 
log(reduceFunction(append, '_', items));    // '10::120::1000'

// 對象屬性累加
const scores = {
    score1 : 10,
    score2 : 120,
    score3 : 1000,
}

log(reduceFunction(add, 0, scores));        // 1130
log(reduceFunction(max, 0, scores));        // 1000
log(reduceFunction(multiply, 1, scores));   // 1200000
log(reduceFunction(append, '_', scores));   // '10::120::1000'

// 數(shù)組轉(zhuǎn)數(shù)字的例子驻龟,比如[1,6,8,8,8] => 16888
function addDigitValue(previousValue, currentDigit, currentIndex, array) {
    const exponent = (array.length - 1) - currentIndex;
    const digitValue = currentDigit * Math.pow(10, exponent);
    return previousValue + digitValue;
}

log([1,6,8,8,8].reduce(addDigitValue, 0));    // 16888
log(reduceFunction(addDigitValue, 0, {
    萬 : 168, 
    千 : 6, 
    百 : 8,
    十 : 8,
    個 : 8,
 }));                                          // 1686888
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末温眉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翁狐,更是在濱河造成了極大的恐慌类溢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闯冷,居然都是意外死亡砂心,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門蛇耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辩诞,“玉大人,你說我怎么就攤上這事纺涤∫朐荩” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵撩炊,是天一觀的道長外永。 經(jīng)常有香客問我,道長拧咳,這世上最難降的妖魔是什么伯顶? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骆膝,結(jié)果婚禮上祭衩,老公的妹妹穿的比我還像新娘。我一直安慰自己阅签,他們只是感情好汪厨,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愉择,像睡著了一般劫乱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锥涕,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天衷戈,我揣著相機(jī)與錄音,去河邊找鬼层坠。 笑死殖妇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的破花。 我是一名探鬼主播谦趣,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼座每!你這毒婦竟也來了前鹅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤峭梳,失蹤者是張志新(化名)和其女友劉穎舰绘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捂寿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年口四,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦陋。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔓彩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驳概,到底是詐尸還是另有隱情赤嚼,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布抡句,位于F島的核電站,受9級特大地震影響杠愧,放射性物質(zhì)發(fā)生泄漏待榔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一流济、第九天 我趴在偏房一處隱蔽的房頂上張望锐锣。 院中可真熱鬧,春花似錦绳瘟、人聲如沸雕憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斤彼。三九已至,卻和暖如春蘸泻,著一層夾襖步出監(jiān)牢的瞬間琉苇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工悦施, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留并扇,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓抡诞,卻偏偏與公主長得像穷蛹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昼汗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4
  • 感謝社區(qū)中各位的大力支持肴熏,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠顷窒,并抽取幸運大獎:點擊這里領(lǐng)取 你...
    HetfieldJoe閱讀 738評論 0 2
  • 規(guī)則: 1.兩兩PK扮超,石頭剪刀布 2.贏的人隨意說出三字,對方需要快速將其反過來并說出來 3.說錯的話則淘汰,說對...
    喻家隱士閱讀 1,234評論 0 0
  • 胡賽尼的三部曲我已經(jīng)看過兩遍了出刷。如果說《追風(fēng)箏的人》是讓讀者發(fā)現(xiàn)人性中的痛苦與無奈璧疗,《群山回唱》則是用一個個的故事...
    莫尼卡同學(xué)閱讀 10,271評論 0 1
  • 春蕾 新蕾含羞輕著痕,芊芊茵里落繽紛馁龟。 經(jīng)雨歷風(fēng)多少季崩侠,才露枝頭又一春。 虞河踏春 春光勝色煙柳輕坷檩,虞水岸上踏歌行...
    佛澄心閱讀 435評論 0 1