摘要:原文作者譯者前段時間,我收聽了一個很棒的播客,其中總結(jié)了一些實用的數(shù)組和對象方法。通過使用這些數(shù)組和對象的方法,你不再需要和循環(huán)來獲得數(shù)組和對象中的數(shù)據(jù)。比如,顯示傳入的實參數(shù)組防止修改現(xiàn)有的對象屬性或者向?qū)ο筇砑有碌膶傩院椭怠?/p>
原文:Useful Javascript Array and Object Methods
作者:Robert Cooper
譯者:Jim Xiao
前段時間,我收聽了一個很棒的Syntax FM播客,其中總結(jié)了一些實用的JavaScript數(shù)組和對象方法。這些方法可以幫助開發(fā)人員編寫簡潔可讀的代碼,并且這些原生的JavaScript方法減少了對類似Lodash這樣第三方庫的依賴。
本文中所有提到的函數(shù)方法都是可以鏈?zhǔn)秸{(diào)用的,意味著它們可以相互結(jié)合地使用。更重要的是,它們并不會變更原始數(shù)據(jù),當(dāng)使用React時,這點(diǎn)尤其重要。通過使用這些數(shù)組和對象的方法,你不再需要for和while循環(huán)來獲得數(shù)組和對象中的數(shù)據(jù)。
下面每個函數(shù)都包含一個鏈接,可以跳轉(zhuǎn)到相對應(yīng)的中文mozilla developer network(MDN)的解釋頁面。
.filter()創(chuàng)建一個新數(shù)組, 其包含通過所提供函數(shù)實現(xiàn)的測試的所有元素。
比如,創(chuàng)建一個學(xué)生年齡數(shù)組,該數(shù)組的值必須大于法定飲酒年齡:
const studentsAge = [17, 16, 18, 19, 21, 17]; const ableToDrink = studentsAge.filter( age => age > 18 ); // [19, 21].map()
創(chuàng)建一個新數(shù)組,其結(jié)果是該數(shù)組中的每個元素都調(diào)用一個提供的函數(shù)后返回的結(jié)果。該方法非常便于數(shù)據(jù)處理,而且在React代碼中常看到,因為它不會改變原始數(shù)組中的數(shù)據(jù)。
比如,創(chuàng)建一個數(shù)組,在每個數(shù)字的開頭添加一個$符號:
const numbers = [2, 3, 4, 5]; const dollars = numbers.map( number => "$" + number); // ["$2", "$3", "$4", "$5"].reduce()
這是一個經(jīng)常被忽略的方法。對累加器和數(shù)組中的每個元素(從左到右)應(yīng)用一個函數(shù),將其減少為單個值。該方法對于計算總數(shù)非常管用。返回值可以是任何類型(例如對象,數(shù)組,字符串,整數(shù))。
比如,對數(shù)組中的元素進(jìn)行加和運(yùn)算:
const numbers = [5, 10, 15]; const total = numbers.reduce( (accumulator, currentValue) => accumulator + currentValue); // 30
在MDN的文檔中還有許多用到.reduce()方法的例子,比如展開數(shù)組,按屬性分組對象以及刪除數(shù)組中的重復(fù)項等。
.forEach()對數(shù)組的每個元素執(zhí)行一次提供的函數(shù)。
比如,把數(shù)組中的每個元素打印到控制臺:
const emotions = ["happy", "sad", "angry"]; emotions.forEach( emotion => console.log(emotion)); // "happy" // "sad" // "angry".some()
判斷數(shù)組中的某些元素是否通過由提供的函數(shù)實現(xiàn)的測試。一個很有用的實例就是檢查用戶的權(quán)限。它在有些時候與.forEach()類似,不同的是,當(dāng)測試數(shù)組中的每個元素的過程中,如果一個truthy值返回,就會立即終止該循環(huán)。
比如,檢查數(shù)組中是否至少有一個"admin"存在:
const userPrivileges = ["user", "user", "user", "admin"]; const containsAdmin = userPrivileges.some( element => element === "admin"); // true.every()
檢查是否數(shù)組中的每個值都滿足條件。
比如,檢查數(shù)組中的評價是否都大于等于3顆星:
const ratings = [3, 5, 4, 3, 5]; const goodOverallRating = ratings.every( rating => rating >= 3 ); // true.includes()
檢查是否一個數(shù)組包含一個確定的值。與.some()相似,但它不是滿足某個條件,而是判斷是否該數(shù)列包含某個具體值。
比如,檢查是否數(shù)列包含一項名為"waldo"的字符串:
const names = ["sophie", "george", "waldo", "stephen", "henry"]; const includesWaldo = names.includes("waldo"); // trueArray.from()
這是一個可以從其他數(shù)組或者字符串中創(chuàng)造新array的方法。你也可以傳入一個回調(diào)函數(shù)作為參數(shù)來操作新數(shù)組的數(shù)據(jù)。
比如,通過一個字符串來創(chuàng)建數(shù)組:
const newArray = Array.from("hello"); // ["h", "e", "l", "l", "o"]
比如,創(chuàng)建一個數(shù)組,該數(shù)組的值是其他數(shù)組中每個項的值的兩倍:
const doubledValues = Array.from([2, 4, 6], number => number * 2); // [4, 8, 12]Objects.values()
返回一個由給定對象自己的所有可枚舉屬性值的數(shù)組。
比如,返回一個對象所有的屬性值:
const icecreamColors = { chocolate: "brown", vanilla: "white", strawberry: "red", } const colors = Object.values(icecreamColors); // ["brown", "white", "red"]Objects.keys()
返回一個由給定對象的自身可枚舉屬性組成的數(shù)組。
比如,返回一個對象所有的屬性名:
const icecreamColors = { chocolate: "brown", vanilla: "white", strawberry: "red", } const types = Object.keys(icecreamColors); // ["chocolate", "vanilla", "strawberry"]Object.entries()
返回一個由一個給定對象的鍵值對組成的數(shù)組。
比如,返回一個對象所有的鍵值對構(gòu)成的數(shù)組:
const weather = { rain: 0, temperature: 24, humidity: 33, } const entries = Object.entries(weather); // [["rain", 0], ["temperature", 24], ["humidity", 33]]Array spread
在數(shù)組中使用擴(kuò)展運(yùn)算符(…)可以展開數(shù)組中的元素。將多個數(shù)組合并成一個數(shù)組時非常有用。而且當(dāng)移除數(shù)組中的某個元素時,我們也可以使用擴(kuò)展運(yùn)算符,而不需要常規(guī)的splice()方法,因為splice()方法會修改原始數(shù)組中的數(shù)據(jù)。
比如,合并兩個數(shù)組:
const spreadableOne = [1, 2, 3, 4]; const spreadableTwo = [5, 6, 7, 8]; const combined = [...spreadableOne, ...spreadableTwo]; // [1, 2, 3, 4, 5, 6, 7, 8]
比如,移除數(shù)組中的元素而不改變原數(shù)組:
const animals = ["squirrel", "bear", "deer", "salmon", "rat"]; const mammals = [...animals.slice(0,3), ...animals.slice(4)]; // ["squirrel", "bear", "deer", "rat"]Object spread
擴(kuò)展對象允許為一個沒有更改的對象添加新的屬性和方法(換句話說,創(chuàng)建了一個新對象)。對象擴(kuò)展符也可以把多個對象合并在一起。注意,該方法不適合嵌套對象的復(fù)制。
比如,為新對象添加屬性和值而并不影響原始的對象:
const spreadableObject = { name: "Robert", phone: "iPhone" }; const newObject = { ...spreadableObject, carModel: "Volkswagen" } // { carModel: "Volkswagen", name: "Robert", phone: "iPhone" }Function rest
函數(shù)可以使用剩余參數(shù)的語法來接受任意數(shù)量的實參。
比如,顯示傳入的實參數(shù)組:
function displayArgumentsArray(...theArguments) { console.log(theArguments); } displayArgumentsArray("hi", "there", "bud"); // ["hi", "there", "bud"]Object.freeze()
防止修改現(xiàn)有的對象屬性或者向?qū)ο筇砑有碌膶傩院椭怠?/strong>通常認(rèn)為該功能跟const很像,但是,const可以允許修改對象中的屬性。
比如,凍結(jié)一個對象以防止更改其屬性:
const frozenObject = { name: "Robert" } Object.freeze(frozenObject); frozenObject.name = "Henry"; // { name: "Robert" }Object.seal()
停止將任何新屬性添加到對象,但仍允許更改現(xiàn)有屬性。
比如:密封對象以防止添加wearWatch屬性:
const sealedObject = { name: "Robert" } Object.seal(sealedObject); sealedObject.name = "Bob"; sealedObject.wearsWatch = true; // { name: "Bob" }Object.assign()
允許將對象組合在一起。因為有了對象擴(kuò)展的語法,Object.assign()的方法變得不那么重要。與對象擴(kuò)展符一樣,它也不能實現(xiàn)深拷貝。如果想實現(xiàn)對象的深拷貝,一個很好的方法是使用像Lodash這樣的第三方庫。
比如, 把兩個對象合并成一個:
const firstObject = { firstName: "Robert" } const secondObject = { lastName: "Cooper" } const combinedObject = Object.assign(firstObject, secondObject); // { firstName: "Robert", lastName: "Cooper" }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95492.html
摘要:使用閉包實現(xiàn)私有變量譯者添加未在構(gòu)造函數(shù)中初始化的屬性在語句結(jié)尾處使用分號在語句結(jié)尾處使用分號是一個很好的實踐。總結(jié)我知道還有很多其他的技巧,竅門和最佳實踐,所以如果你有其他想要添加或者對我分享的這些有反饋或者糾正,請在評論中指出。 showImg(http://segmentfault.com/img/bVbJnR); 如你所知,JavaScript是世界上第一的編程語言(編者注:2...
摘要:通過對一系列任務(wù)建模來理解一些非常重要的函數(shù)式編程在列表操作中的價值一些些看起來不像列表的語句作為列表操作,而不是單獨(dú)執(zhí)行。映射我們將采用最基礎(chǔ)和最簡單的操作來開啟函數(shù)式編程列表操作的探索。函子是采用運(yùn)算函數(shù)有效用操作的值。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著...
摘要:最近手頭上做了一個很大的后臺管理項目,前端對復(fù)雜數(shù)據(jù)的處理要求頗高,也確實讓自己發(fā)現(xiàn)了很多之前被忽視的細(xì)節(jié)。鳴人佐助卡卡西佐助佐助佐助但是很遺憾及更早版本也不支持。 ??最近手頭上做了一個很大的后臺管理項目,前端對復(fù)雜數(shù)據(jù)的處理要求頗高,也確實讓自己發(fā)現(xiàn)了很多之前被忽視的細(xì)節(jié)。在此特整理出來,希望不熟悉的朋友們們以后可以繞開我踩的這些坑。本文初衷在于幫助大家梳理一些數(shù)組操作上的重點(diǎn)和易...
摘要:數(shù)組索引只是具有整數(shù)名稱的枚舉屬性,并且與通用對象屬性相同。利用的解構(gòu)賦值解構(gòu)賦值尾遞歸優(yōu)化遞歸非常耗內(nèi)存,因為需要同時保存成千上百個調(diào)用幀,很容易發(fā)生棧溢出。而尾遞歸的實現(xiàn),往往需要改寫遞歸函數(shù),確保最后一步只調(diào)用自身。 一.前言 因為在工作當(dāng)中,經(jīng)常使用到j(luò)s的數(shù)組,而其中對數(shù)組方法的使用也是很頻繁的,所以總是會有弄混或者概念不夠清晰的狀況,所以,寫下這篇文章整理一番,本文有對幾乎...
摘要:每種編程語言都有一些黑魔法或者說小技巧,也不例外,大部分是借助或者瀏覽器新特性實現(xiàn)。下面介紹的個實用小技巧,相信其中有些你一定用過。當(dāng)然不管語言如何變化,我們總能在編程中總結(jié)一些小技巧來精簡代碼。 showImg(https://segmentfault.com/img/remote/1460000018902642); 每種編程語言都有一些黑魔法或者說小技巧,JS也不例外,大部分是借...
閱讀 960·2023-04-25 23:54
閱讀 3041·2021-11-08 13:21
閱讀 3769·2021-09-27 13:35
閱讀 3390·2021-07-26 23:41
閱讀 1053·2019-08-30 15:52
閱讀 3437·2019-08-30 11:27
閱讀 2097·2019-08-29 18:37
閱讀 536·2019-08-29 17:24