电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JavaScript中Array方法的正確打開方式

瀏覽:95日期:2023-11-10 13:31:02

JavaScript中Array方法的正確打開方式

在過去的幾個月,我發現我的拉取請求中存在四個完全相同的 JavaScript 錯誤。于是我寫了這篇文章,總結了如何在 JavaScript 中正確使用地使用 Array 的方法!

用 Array.includes 代替 Array.indexOf

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

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

但是,如果我們只想知道數組是否包含某個值,該怎么辦?這似乎是一個是與否的問題,或者說是一個布爾值問題。對于這種情況,我建議使用返回布爾值的 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 是一個非常有用的方法。它接受一個回調函數作為參數,基于一個包含所有元素的數組創建出一個新的數組。正如它的名字一樣,我們使用這個方法來過濾元素,獲得更短的數組。

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

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

為了避免這種情況,我建議使用 Array.find。它需要一個像 Array.filter 一樣的回調函數作為參數,并返回滿足回調函數的第一個元素的值。此外,只要找到第一個滿足回調函數的元素,Array.find 就會停止,無需遍歷整個數組。通過 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

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

在前面的例子中,我們看到 Array.find 需要一個回調函數作為參數,并返回一個元素。如果我們想要知道數組是否包含某個值,Array.find 是最好的解決方案嗎?可能不是,因為它返回的是一個元素值,而不是一個布爾值。

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

’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

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

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

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

在我們的例子中,因為之前使用了 Array.map,所以我建議使用 Array.reduce 將滿足條件的數組元素加入到累加器中。在下面的示例中,根據 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’] } // ]

【責任編輯:龐桂玉 TEL:(010)68476606】

來自:http://developer.51cto.com/art/201809/583079.htm

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 上海阳光泵业制造有限公司 -【官方网站】 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 凝胶成像仪,化学发光凝胶成像系统,凝胶成像分析系统-上海培清科技有限公司 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 临朐空调移机_空调维修「空调回收」临朐二手空调 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 衬塑管道_衬四氟管道厂家-淄博恒固化工设备有限公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 光环国际-新三板公司_股票代码:838504| 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 物流公司电话|附近物流公司电话上门取货 | 有声小说,听书,听小说资源库-听世界网 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 四川成人高考_四川成考报名网| 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 |