摘要:一個歸并方法第一個參數是每一項上調用的函數,該函數有四個參數累加回調返回值他是上一次調用時返回的累積值,或數組中正在處理的元素數組中正在處理的當前元素的索引。統計數組中重復出現項的個數,用對象表示。
前言
在實際js開發中對數組操作頻率非常高,看過一些小伙伴的一些用法,挺有意思,在這里小記(不全)一下,備忘。
5個迭代方法:every、filter、forEach、map和someevery():對數組中的每一項運行給定函數,如果該函數每一項都返回true,則返回true;
filter():對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組;
forEach():對數組中的每一項運行給定函數,這個方法沒有返回值;
map():對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組;
some():對數組中的每一項運行給定函數,如果該函數任意一項返回true,則返回true;
// every var numbers = [1, 2, 3, 4, 5, 6, 7]; var everyResult = numbers.every(function (item, index, array) { return (item > 2); }); console.log(everyResult); // false // some someResult = numbers.some(function (item, index, array) { return (item > 2); }); console.log(someResult); // true // filter var filterResult = numbers.filter(function (item, index, array) { return (item > 2); }); console.log(filterResult); // [3, 4, 5, 6, 7] // map var mapResult = numbers.map(function (item, index, array) { return item * 2; }); console.log(mapResult); // [2, 4, 6, 8, 10, 12, 14]被忽視的 map 的第二個、第三個參數
通常情況下, map 方法中的 callback 函數只接受一個參數,就是正在被遍歷數組元素本身。但不意味著 map 只給 callback 傳一個參數,這種慣性思維很可能會讓我們犯錯。下面舉一個例子:
下面語句返回什么呢:["1", "2", "3"].map(parseInt)
可能你會覺得是 [1, 2, 3],但實際結果是 [1, NaN, NaN]。
map 回調方法 callback(currentValue, index, array) 有三個參數,第一個是數組中正在處理的當前元素,第二個是當前元素索引,第三個是數組本身。
Number.parseInt(string[, radix])有兩個參數,第一個是待轉化字符,第二個是進制數。parseInt傳入第三個參數會被忽略。
因此,上述執行
parseInt("1", 0, ["1", "2", "3"]) // 1 parseInt("2", 1, ["1", "2", "3"]) // NaN parseInt("3", 2, ["1", "2", "3"]) // NaN拓展 map 在實際項目中的應用
匹配查找某個目錄下的文件并引入。
context.require 返回一個 require 函數:
function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); }
該函數有一個 keys 屬性,是一個函數,返回一個數組,該數組是由所有可能被上下文模塊的請求對象組成。
let requireAll = requireContext => requireContext.keys().map(requireContext) let req = require.context("./svg", false, /.svg$/) requireAll(req)
這樣通過 map 遍歷,結合引入上下文對象作為回調函數,即可獲取引入某個目錄下的 svg 資源。
一個歸并方法:reducearray.reduce(callback[, initialValue])第一個參數是每一項上調用的函數,該函數有四個參數:
accumulator:累加回調返回值;他是上一次調用時返回的累積值,或initValue;
currentValue:數組中正在處理的元素;
currentIndex:數組中正在處理的當前元素的索引。如果提供了initialValue,這索引號為0,否則索引為1;
array:調用reduce()的數組。
當第二個參數省略時,遍歷從數組第二項開始,數組第一項被當作前一個值accumulator。
數組求和
const numbers = [10, 20, 30, 40]; numbers.reduce((acc, cur, index, arr) => { console.log("acc: " + acc + "; " + "cur: " + cur + ";"); return acc + cur; })
結果為:
acc: 10; cur: 20; acc: 30; cur: 30; acc: 60; cur: 40;
這第二個參數就是設置accumulator的初始類型和初始值,比如為0,就表示accumulator的初始值為Number類型,值為0,因此,reduce的最終結果也會是Number類型。
const numbers = [10, 20, 30, 40]; numbers.reduce((acc, cur, index, arr) => { console.log("acc: " + acc + "; " + "cur: " + cur + ";"); return acc + cur; }, 0)
結果為:
acc: 0; cur: 10; acc: 10; cur: 20; acc: 30; cur: 30; acc: 60; cur: 40;強大的reduce
reduce作為歸并方法,在有些情形可以替代其它數組操作方法,強大之處,還得要落實在具體的案例上。
假設現在有一個數列[10, 20, 30, 40, 50],每一項乘以2,然后篩選出大于60的項。
在這里更新數組每一項(map的功能)然后篩選出一部分(filter的功能),如果是先使用map然后filter的話,你需要遍歷這個數組兩次。在這里用reduce更高效。
var numbers = [10, 20, 30, 40, 50]; var result = numbers.reduce(function (acc, cur) { cur = cur * 2; if (cur > 60) { acc.push(cur); } return acc; }, []); console.log(result); // [80, 100]
從這個例子可以看出reduce完成了map和filter的使命。
統計數組中重復出現項的個數,用對象表示。
var letters = ["A", "B", "C", "C", "B", "C", "C"]; var letterObj = letters.reduce(function (acc, cur) { acc[cur] = acc[cur] ? ++acc[cur] : 1; return acc; }, {}); console.log(letterObj); // {A: 1, B: 2, C: 4}
數組去重
var letters = ["A", "B", "C", "C", "B", "C", "C"]; var letterArr = letters.reduce(function (acc, cur) { if (acc.indexOf(cur) === -1) { acc.push(cur); } return acc; }, []); console.log(letterArr); // ?["A", "B", "C"]
ps:了解更多數組去重方法,點這里。
與ES6的結合與ES6結合使用也會擦出不少火花。
刪除目標對象某個屬性。
const person = { name: "jazz", gender: "male", age: 24 }; const personUnknowAge = Object.keys(person).filter((key) => { return key !== "age"; }) .map((key) => { return { [key]: person[key] } }) .reduce((acc, cur) => { return {...acc, ...cur}; }, {}); console.log(personUnknowAge); // {name: "jazz", gender: "male"}
更簡潔的方案,利用ES6中函數參數解構:
const personUnknowAge = (({name, gender}) => ({name, gender}))(person); console.log(personUnknowAge); // {name: "jazz", gender: "male"}
當然還有更簡單的方案,利用ES6中對象解構:
const person = { name: "jazz", gender: "male", age: 24 }; let { age, ...personUnknowAge } = person; console.log(personUnknowAge); // {name: "jazz", gender: "male"}結尾
數組操作的“妙用”遠不止這些,后面有空再研究補充吧,完~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100407.html
摘要:本文將模擬一個歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。創建廣告牌寬度高度深度寬度上的節數高度上的節數深度上的節數中心點家具展銷歐派這里給我們給整個場景用抽象物體圍起來了,以免第一人稱控件開啟時會造成無碰撞體系墜落出場景。 本文將模擬一個歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。 第一步,利用CampusBuilder搭建模擬場景。CampusBuilder的模...
摘要:最重要的就是找一個適合自己的主題了。事實上,免費主題也非常多,而且很多的免費主題在功能上和界面美觀上已經大大超過了付費的主題。加上這些主題都是開源的,基本上可以在上找得到源碼,安全性是沒有問題,主題的作者也在不斷更新當中。WordPress最重要的就是找一個適合自己的主題了。好一點的WordPress主題基本上都是要收費的,而且價格還不便宜,這導致了不少的新手朋友們很為難。而有時我們僅僅根據...
摘要:方法這個方法就比較簡單沒什么復雜可言,就判斷是否存在宏指令。通常是使用宏指令之前判斷一下。中對類增加宏指令中很多類都使用了宏這個比如,我們想為這個類增加一個方法,但不會動到里面的代碼。 百度百科的定義:計算機科學里的宏(Macro),是一種批量處理的稱謂。一般說來,宏是一種規則或模式,或稱語法替換 ,用于說明某一特定輸入(通常是字符串)如何根據預定義的規則轉換成對應的輸出(通常也是字符...
摘要:擴展運算符是以下簡稱中又一非常好用的實戰技術它的寫法只需要三個點作用則顧名思義用來展開你想要使用的任意變量本質上是對所有擁有迭代器接口的對象進行迭代。 擴展運算符(spreading)是 ECMASCRIPT 6(以下簡稱ES 6) 中又一非常好用的實戰技術, 它的寫法只需要三個點(...),作用則顧名思義,用來展開你想要使用的任意變量,本質上是對所有擁有迭代器接口(Iterator)...
閱讀 2853·2021-09-10 10:51
閱讀 2220·2021-09-02 15:21
閱讀 3214·2019-08-30 15:44
閱讀 880·2019-08-29 18:34
閱讀 1659·2019-08-29 13:15
閱讀 3329·2019-08-26 11:37
閱讀 2702·2019-08-26 10:46
閱讀 1116·2019-08-26 10:26