成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

簡約強大數(shù)組操作組合

chenjiang3 / 874人閱讀

摘要:一個歸并方法第一個參數(shù)是每一項上調(diào)用的函數(shù),該函數(shù)有四個參數(shù)累加回調(diào)返回值他是上一次調(diào)用時返回的累積值,或數(shù)組中正在處理的元素數(shù)組中正在處理的當前元素的索引。統(tǒng)計數(shù)組中重復(fù)出現(xiàn)項的個數(shù),用對象表示。

前言

在實際js開發(fā)中對數(shù)組操作頻率非常高,看過一些小伙伴的一些用法,挺有意思,在這里小記(不全)一下,備忘。

5個迭代方法:every、filter、forEach、map和some

every():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)每一項都返回true,則返回true;

filter():對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)會返回true的項組成的數(shù)組;

forEach():對數(shù)組中的每一項運行給定函數(shù),這個方法沒有返回值;

map():對數(shù)組中的每一項運行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組;

some():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)任意一項返回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 的第二個、第三個參數(shù)

通常情況下, map 方法中的 callback 函數(shù)只接受一個參數(shù),就是正在被遍歷數(shù)組元素本身。但不意味著 map 只給 callback 傳一個參數(shù),這種慣性思維很可能會讓我們犯錯。下面舉一個例子:

下面語句返回什么呢:["1", "2", "3"].map(parseInt)

可能你會覺得是 [1, 2, 3],但實際結(jié)果是 [1, NaN, NaN]。

map 回調(diào)方法 callback(currentValue, index, array) 有三個參數(shù),第一個是數(shù)組中正在處理的當前元素,第二個是當前元素索引,第三個是數(shù)組本身。

Number.parseInt(string[, radix])有兩個參數(shù),第一個是待轉(zhuǎn)化字符,第二個是進制數(shù)。parseInt傳入第三個參數(shù)會被忽略。

因此,上述執(zhí)行

parseInt("1", 0, ["1", "2", "3"]) // 1
parseInt("2", 1, ["1", "2", "3"]) // NaN
parseInt("3", 2, ["1", "2", "3"]) // NaN
拓展 map 在實際項目中的應(yīng)用

匹配查找某個目錄下的文件并引入。

context.require 返回一個 require 函數(shù):

function webpackContext(req) {
  return __webpack_require__(webpackContextResolve(req));
}

該函數(shù)有一個 keys 屬性,是一個函數(shù),返回一個數(shù)組,該數(shù)組是由所有可能被上下文模塊的請求對象組成。

let requireAll = requireContext => requireContext.keys().map(requireContext)
let req = require.context("./svg", false, /.svg$/)
requireAll(req)

這樣通過 map 遍歷,結(jié)合引入上下文對象作為回調(diào)函數(shù),即可獲取引入某個目錄下的 svg 資源。

一個歸并方法:reduce

array.reduce(callback[, initialValue])第一個參數(shù)是每一項上調(diào)用的函數(shù),該函數(shù)有四個參數(shù):

accumulator:累加回調(diào)返回值;他是上一次調(diào)用時返回的累積值,或initValue;

currentValue:數(shù)組中正在處理的元素;

currentIndex:數(shù)組中正在處理的當前元素的索引。如果提供了initialValue,這索引號為0,否則索引為1;

array:調(diào)用reduce()的數(shù)組。

當?shù)诙€參數(shù)省略時,遍歷從數(shù)組第二項開始,數(shù)組第一項被當作前一個值accumulator。

數(shù)組求和

const numbers = [10, 20, 30, 40];
numbers.reduce((acc, cur, index, arr) => {
  console.log("acc: " + acc + "; " + "cur: " + cur + ";");
  return acc + cur;
})

結(jié)果為:

acc: 10; cur: 20;
acc: 30; cur: 30;
acc: 60; cur: 40;

這第二個參數(shù)就是設(shè)置accumulator的初始類型和初始值,比如為0,就表示accumulator的初始值為Number類型,值為0,因此,reduce的最終結(jié)果也會是Number類型。

const numbers = [10, 20, 30, 40];
numbers.reduce((acc, cur, index, arr) => {
  console.log("acc: " + acc + "; " + "cur: " + cur + ";");
  return acc + cur;
}, 0)

結(jié)果為:

acc: 0; cur: 10;
acc: 10; cur: 20;
acc: 30; cur: 30;
acc: 60; cur: 40;
強大的reduce

reduce作為歸并方法,在有些情形可以替代其它數(shù)組操作方法,強大之處,還得要落實在具體的案例上。

假設(shè)現(xiàn)在有一個數(shù)列[10, 20, 30, 40, 50],每一項乘以2,然后篩選出大于60的項。

在這里更新數(shù)組每一項(map的功能)然后篩選出一部分(filter的功能),如果是先使用map然后filter的話,你需要遍歷這個數(shù)組兩次。在這里用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完成了mapfilter的使命。

統(tǒng)計數(shù)組中重復(fù)出現(xiàn)項的個數(shù),用對象表示。
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}
數(shù)組去重
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:了解更多數(shù)組去重方法,點這里。

與ES6的結(jié)合

與ES6結(jié)合使用也會擦出不少火花。

刪除目標對象某個屬性。
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中函數(shù)參數(shù)解構(gòu):

const personUnknowAge = (({name, gender}) => ({name, gender}))(person);
console.log(personUnknowAge); // {name: "jazz", gender: "male"}

當然還有更簡單的方案,利用ES6中對象解構(gòu):

const person = {
  name: "jazz",
  gender: "male",
  age: 24
};
let { age, ...personUnknowAge } = person;
console.log(personUnknowAge); // {name: "jazz", gender: "male"}
結(jié)尾

數(shù)組操作的“妙用”遠不止這些,后面有空再研究補充吧,完~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100407.html

相關(guān)文章

  • 基于WEBGL架構(gòu)的3D可視化平臺—家居城3D展示

    摘要:本文將模擬一個歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。創(chuàng)建廣告牌寬度高度深度寬度上的節(jié)數(shù)高度上的節(jié)數(shù)深度上的節(jié)數(shù)中心點家具展銷歐派這里給我們給整個場景用抽象物體圍起來了,以免第一人稱控件開啟時會造成無碰撞體系墜落出場景。 本文將模擬一個歐派,讓大家足不出戶在家里就能更加直觀立體的挑選家具。 第一步,利用CampusBuilder搭建模擬場景。CampusBuilder的模...

    libin19890520 評論0 收藏0
  • 收集整理適用博客建站免費開源Wordpress主題-簡約好看的WP主題

    摘要:最重要的就是找一個適合自己的主題了。事實上,免費主題也非常多,而且很多的免費主題在功能上和界面美觀上已經(jīng)大大超過了付費的主題。加上這些主題都是開源的,基本上可以在上找得到源碼,安全性是沒有問題,主題的作者也在不斷更新當中。WordPress最重要的就是找一個適合自己的主題了。好一點的WordPress主題基本上都是要收費的,而且價格還不便宜,這導致了不少的新手朋友們很為難。而有時我們僅僅根據(jù)...

    番茄西紅柿 評論0 收藏2637
  • Laravel 中簡約而不簡單的 Macroable 宏指令

    摘要:方法這個方法就比較簡單沒什么復(fù)雜可言,就判斷是否存在宏指令。通常是使用宏指令之前判斷一下。中對類增加宏指令中很多類都使用了宏這個比如,我們想為這個類增加一個方法,但不會動到里面的代碼。 百度百科的定義:計算機科學里的宏(Macro),是一種批量處理的稱謂。一般說來,宏是一種規(guī)則或模式,或稱語法替換 ,用于說明某一特定輸入(通常是字符串)如何根據(jù)預(yù)定義的規(guī)則轉(zhuǎn)換成對應(yīng)的輸出(通常也是字符...

    itvincent 評論0 收藏0
  • ECMASCRIPT 6 實戰(zhàn)之 擴展運算符

    摘要:擴展運算符是以下簡稱中又一非常好用的實戰(zhàn)技術(shù)它的寫法只需要三個點作用則顧名思義用來展開你想要使用的任意變量本質(zhì)上是對所有擁有迭代器接口的對象進行迭代。 擴展運算符(spreading)是 ECMASCRIPT 6(以下簡稱ES 6) 中又一非常好用的實戰(zhàn)技術(shù), 它的寫法只需要三個點(...),作用則顧名思義,用來展開你想要使用的任意變量,本質(zhì)上是對所有擁有迭代器接口(Iterator)...

    habren 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<