国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

簡約強大數組操作組合

chenjiang3 / 871人閱讀

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

前言

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

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

every():對數組中的每一項運行給定函數,如果該函數每一項都返回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 資源。

一個歸并方法:reduce

array.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完成了mapfilter的使命。

統計數組中重復出現項的個數,用對象表示。
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

相關文章

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

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

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

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

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

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

    itvincent 評論0 收藏0
  • ECMASCRIPT 6 實戰之 擴展運算符

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

    habren 評論0 收藏0

發表評論

0條評論

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