最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中Array方法你該知道的正確打開方法

 更新時(shí)間:2018年09月11日 10:08:22   作者:前端之巔  
string和array作為javascript內(nèi)置對象,其中許多方法無論是在開發(fā)過程中,還是在面試的時(shí)候都有機(jī)會被面試官問到,下面這篇文章主要給大家介紹了關(guān)于JavaScript中Array方法你該知道的正確打開方法,需要的朋友可以參考下

前言

在過去的幾個(gè)月,我發(fā)現(xiàn)我的拉取請求中存在四個(gè)完全相同的 JavaScript 錯(cuò)誤。于是我寫了這篇文章,總結(jié)了如何在 JavaScript 中正確使用地使用 Array 的方法!

Array對象為JavaScript內(nèi)置對象,具有以下屬性:

屬性 描述
constructor 返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用。
length 返回?cái)?shù)組中元素的個(gè)數(shù)
prototype 向?qū)ο筇砑訉傩院头椒ā?/td>

用 Array.includes 代替 Array.indexOf

“如果你要在數(shù)組中查找元素,請使用 Array.indexOf”。我記得在學(xué)習(xí) JavaScript 的時(shí)候,在教材中讀到這樣的一句話。毫無疑問,這句話是真的!

MDN 文檔寫道,Array.indexOf 將“返回第一次出現(xiàn)給定元素的索引”。因此,如果我們稍后要在代碼中使用這個(gè)返回的索引,那么使用 Array.indexOf 找到索引就對了。

但是,如果我們只想知道數(shù)組是否包含某個(gè)值,該怎么辦?這似乎是一個(gè)是與否的問題,或者說是一個(gè)布爾值問題。對于這種情況,我建議使用返回布爾值的 Array.includes。

'use strict';

const characters = [
 'ironman',
 'black_widow',
 'hulk',
 'captain_america',
 'hulk',
 'thor',
];

console.log(characters.indexOf('hulk'));
// 2
console.log(characters.indexOf('batman'));
// -1

console.log(characters.includes('hulk'));
// true
console.log(characters.includes('batman'));
// false

使用 Array.find 而不是 Array.filter

Array.filter 是一個(gè)非常有用的方法。它接受一個(gè)回調(diào)函數(shù)作為參數(shù),基于一個(gè)包含所有元素的數(shù)組創(chuàng)建出一個(gè)新的數(shù)組。正如它的名字一樣,我們使用這個(gè)方法來過濾元素,獲得更短的數(shù)組。

但是,如果回調(diào)函數(shù)只能返回一個(gè)元素,那么我就不推薦使用這個(gè)方法,例如使用回調(diào)函數(shù)來過濾唯一 ID。在這種情況下,Array.filter 將返回一個(gè)只包含一個(gè)元素的新數(shù)組。我們的意圖可能是通過查找特定的 ID 找到數(shù)組中包含的唯一值。

我們來看看這個(gè)方法的性能。要返回與回調(diào)函數(shù)匹配的所有元素,Array.filter 必須遍歷整個(gè)數(shù)組。此外,我們假設(shè)有數(shù)百個(gè)元素可以滿足回調(diào)參數(shù),那么過濾后的數(shù)組會非常大。

為了避免這種情況,我建議使用 Array.find。它需要一個(gè)像 Array.filter 一樣的回調(diào)函數(shù)作為參數(shù),并返回滿足回調(diào)函數(shù)的第一個(gè)元素的值。此外,只要找到第一個(gè)滿足回調(diào)函數(shù)的元素,Array.find 就會停止,無需遍歷整個(gè)數(shù)組。通過 Array.find 來查找元素,我們可以更好地理解我們的意圖。

'use strict';

const characters = [
 { id: 1, name: 'ironman' },
 { id: 2, name: 'black_widow' },
 { id: 3, name: 'captain_america' },
 { id: 4, name: 'captain_america' },
];

function getCharacter(name) {
 return character => character.name === name;
}

console.log(characters.filter(getCharacter('captain_america')));
// [
// { id: 3, name: 'captain_america' },
// { id: 4, name: 'captain_america' },
// ]

console.log(characters.find(getCharacter('captain_america')));
// { id: 3, name: 'captain_america' }

用 Array.some 代替 Array.find

我承認(rèn)這個(gè)錯(cuò)誤我犯了很多次。然后,一位善良的朋友告訴我,最好可以先參考 MDN 文檔。這與上面的 Array.indexOf/Array.includes 非常相似。

在前面的例子中,我們看到 Array.find 需要一個(gè)回調(diào)函數(shù)作為參數(shù),并返回一個(gè)元素。如果我們想要知道數(shù)組是否包含某個(gè)值,Array.find 是最好的解決方案嗎?可能不是,因?yàn)樗祷氐氖且粋€(gè)元素值,而不是一個(gè)布爾值。

對于這種情況,我建議使用 Array.some,它返回所需的布爾值。另外,從語義上看,Array.some 表示我們只想知道某個(gè)元素是否存在,而不需要得到這個(gè)元素。

'use strict';

const characters = [
 { id: 1, name: 'ironman', env: 'marvel' },
 { id: 2, name: 'black_widow', env: 'marvel' },
 { id: 3, name: 'wonder_woman', env: 'dc_comics' },
];

function hasCharacterFrom(env) {
 return character => character.env === env;
}

console.log(characters.find(hasCharacterFrom('marvel')));
// { id: 1, name: 'ironman', env: 'marvel' }

console.log(characters.some(hasCharacterFrom('marvel')));
// true

使用 Array.reduce 而不是鏈接 Array.filter 和 Array.map

讓我們面對現(xiàn)實(shí)吧,Array.reduce 不容易理解。事實(shí)確實(shí)如此!但是,如果我們使用 Array.filter 和 Array.map 的組合,感覺缺少了什么,對吧?

我的意思是,我們遍歷了兩次數(shù)組。第一次過濾數(shù)組并創(chuàng)建一個(gè)較短的數(shù)組,第二次又基于 Array.filter 獲得數(shù)組創(chuàng)建一個(gè)包含新值的數(shù)組。為了獲得我們想要的新數(shù)組,我們使用了兩個(gè) Array 方法。每個(gè)方法都有自己的回調(diào)函數(shù)和一個(gè)用不到的數(shù)組——由 Array.filter 創(chuàng)建的那個(gè)數(shù)組。

為了避免這種性能損耗,我的建議是使用 Array.reduce。結(jié)果是一樣的,代碼卻更簡單! 我們可以使用 Array.reduce 進(jìn)行過濾,并將目標(biāo)元素添加到累加器中。累加器可以是遞增的數(shù)字、要填充的對象、要連接的字符串或數(shù)組。

在我們的例子中,因?yàn)橹笆褂昧?Array.map,所以我建議使用 Array.reduce 將滿足條件的數(shù)組元素加入到累加器中。在下面的示例中,根據(jù) env 值的具體情況,我們將它添加到累加器中或保持累加器不變。

'use strict';

const characters = [
 { name: 'ironman', env: 'marvel' },
 { name: 'black_widow', env: 'marvel' },
 { name: 'wonder_woman', env: 'dc_comics' },
];

console.log(
 characters
 .filter(character => character.env === 'marvel')
 .map(character => Object.assign({}, character, { alsoSeenIn: ['Avengers'] }))
);
// [
// { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] },
// { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] }
// ]

console.log(
 characters
 .reduce((acc, character) => {
  return character.env === 'marvel'
  ? acc.concat(Object.assign({}, character, { alsoSeenIn: ['Avengers'] }))
  : acc;
 }, [])
)
// [
// { name: 'ironman', env: 'marvel', alsoSeenIn: ['Avengers'] },
// { name: 'black_widow', env: 'marvel', alsoSeenIn: ['Avengers'] }
// ]

英文原文:

https://medium.freecodecamp.org/heres-how-you-can-make-better-use-of-javascript-arrays-3efd6395af3c

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

  • 純JS半透明Tip效果代碼

    純JS半透明Tip效果代碼

    自己根據(jù)網(wǎng)上提供的一個(gè)透明功能類庫寫的純JS半透明Tip效果
    2008-10-10
  • 小程序?qū)崿F(xiàn)錄音功能

    小程序?qū)崿F(xiàn)錄音功能

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)錄音功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Javascript從數(shù)組中隨機(jī)取出不同元素的兩種方法

    Javascript從數(shù)組中隨機(jī)取出不同元素的兩種方法

    這篇文章給大家分享了兩種Javascript從數(shù)組中隨機(jī)取出不同元素的方法,大家可以都學(xué)習(xí)學(xué)習(xí),這樣更能有助于大家的學(xué)習(xí)和理解,下面來一起看看吧
    2016-09-09
  • ES6字符串和數(shù)值新增方法總結(jié)

    ES6字符串和數(shù)值新增方法總結(jié)

    ES6為js新增了很多方法,包括遍歷、查詢、替換等等,下面這篇文章主要給大家介紹了關(guān)于ES6字符串和數(shù)值新增方法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • js點(diǎn)擊button按鈕跳轉(zhuǎn)到另一個(gè)新頁面

    js點(diǎn)擊button按鈕跳轉(zhuǎn)到另一個(gè)新頁面

    點(diǎn)擊按鈕怎么跳轉(zhuǎn)到另外一個(gè)頁面呢?點(diǎn)擊圖片要跳轉(zhuǎn)到新的頁面時(shí),怎么做到呢?可以使用onclick=window.location=新頁面來實(shí)現(xiàn)
    2014-10-10
  • js函數(shù)setTimeout延遲執(zhí)行的簡單介紹

    js函數(shù)setTimeout延遲執(zhí)行的簡單介紹

    設(shè)置指定的JS函數(shù)在指定的時(shí)間后執(zhí)行,可以利用setTimeout()函數(shù)。
    2013-07-07
  • JS?中的?Event?Loop?是什么你真的懂

    JS?中的?Event?Loop?是什么你真的懂

    Event Loop,簡單翻譯就是?事件循環(huán),是 JS 語言下實(shí)現(xiàn)運(yùn)行時(shí)的一個(gè)機(jī)制,這篇文章主要介紹了JS?中的?Event?Loop?的基本知識,需要的朋友可以參考下
    2022-06-06
  • 純前端使用插件pdfjs實(shí)現(xiàn)將pdf轉(zhuǎn)為圖片的步驟

    純前端使用插件pdfjs實(shí)現(xiàn)將pdf轉(zhuǎn)為圖片的步驟

    這篇文章主要介紹了純前端使用插件pdfjs實(shí)現(xiàn)將pdf轉(zhuǎn)為圖片的步驟,在實(shí)現(xiàn)過程中遇到了跨域問題,后臺設(shè)置跨域但前端配置無效,最終采用后臺返回PDF的base64格式,通過PDF.js將base64轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)加載PDF,需要的朋友可以參考下
    2025-01-01
  • electron中preload.js文件的用法小結(jié)

    electron中preload.js文件的用法小結(jié)

    preload.js文件在Electron應(yīng)用中起著橋梁的作用,使得在保持安全的同時(shí),渲染進(jìn)程可以訪問主進(jìn)程的功能,保持渲染進(jìn)程與主進(jìn)程隔離的同時(shí),又能使渲染進(jìn)程具有訪問特定Electron API的能力的方法,本文給大家分享electron中preload.js文件的用法,感興趣的朋友一起看看吧
    2024-04-04
  • 最新評論

    商水县| 金坛市| 长治市| 余干县| 西青区| 石门县| 时尚| 宣化县| 武城县| 安顺市| 丰都县| 绍兴市| 榆树市| 常宁市| 尉犁县| 远安县| 壤塘县| 玉树县| 江北区| 沾益县| 宁河县| 潍坊市| 丹凤县| 东方市| 称多县| 昔阳县| 微山县| 石棉县| 德昌县| 肇州县| 嵊泗县| 武威市| 成都市| 平泉县| 苏尼特左旗| 安庆市| 曲水县| 瑞昌市| 碌曲县| 梅州市| 徐水县|