热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

结合使用.filter()和.map()解决性能问题

发布它们的介绍后,.map()和.filter()如今在代码中与死亡大忌结合使用,因为“很简单”

发布它们的介绍后,.map()和.filter()如今在代码中与死亡大忌结合使用,因为“很简单”。 但是盲目使用这些方法是否会在代码中引起性能问题? 让我们深入了解。 我不会详细介绍这些功能的工作原理,因为有大量材料可供选择。

[理论警报]

那些熟悉Big'O'表示法的人可能知道.map()和.filter()在O(n)执行,其中n是所讨论数组的元素数。

因此,链接filter()。map()表示该执行链的运行时间在最坏的情况下为O(n)+ O(n)。

该死的,这些现代的扩展使编写性能差的代码变得更加容易。

那么我们该怎么办?

好吧,很明显,这里的问题是原始数组(或其过滤结果)被循环了两次。 弄清楚如何减少(循环…… 提示,眨眼眨眼 )循环次数,问题得以解决。

如果您现在要问的是,这有多困难,以及如果最终要编写很多样板代码,请不要担心。

.reduce()进行救援

reduce方法在数组的每个元素上执行(提供的)reduce函数,从而产生单个输出值。 但是,有趣的部分是,该单​​个输出值也可以是数组。

因此,对于我们来说,实现一个遍历原始数组并一次执行filter()和map()动作的函数变得容易。 最好是在映射之前进行过滤,以提高性能(提示:要经过的项目数量减少),除非有其他原因需要这样做。

因此,如果我们为此编写一些代码,它将看起来如下。

function filterAndMap ( arr, filterCallback, mapCallback ) {let reduced = arr.reduce( function ( filteredAndMapped, item ) {if (filterCallback(item)) {let mappedItem = mapCallback(item);filteredAndMapped.push(mappedItem);}return filteredAndMapped;}, []);return reduced;
}

现在,您有一个需要3个参数的函数。 您要处理的数组,用于测试过滤条件的回调以及将结果转换为所需内容的回调。 阅读代码,您可以看到Array仅迭代了一次,从而为我们提供了所需的性能提升。

现在,使它成为Array对象的扩展方法。 通过为Array设计原型方法可以很容易地做到这一点。

沃伊拉

为了使上述功能成为原型方法,我们必须做一些事情。 首先,我们必须处理“ this ”的情况,这可能在不同的上下文中表示不同的东西-想想nodejs,基于浏览器的Javascript。 因此,我们的原型方法如下所示。

Array .prototype.filterMap = function ( filterCallback, mapCallback ) {let obj = Object ( this );if (obj.length === 0 ) return null ;
if ( typeof filterCallback === "undefined" ) throw ;if ( typeof mapCallback === "undefined" ) throw ;
let reduced = this .reduce( function ( filteredAndMapped, item ) {if (filterCallback(item)) {let mappedItem = mapCallback(item);filteredAndMapped.push(mappedItem);}return filteredAndMapped;}, []);
return reduced;
};

那就是所有的人。 呈现Array.prototype.filterMap()

这就是我们有一个简单的代码段的方式,该代码段使我们可以同时使用.filter()和.map(),而不会损失代码性能。

干杯,敬请期待更多类似这些的摘要。 为那些不想复制和粘贴代码人创建了.filterMap()的npm模块并将其发布后,我将更新本文

先前发布在https://medium.com/@deepak.mani.0211/filtermap-in-Javascript-solving-performance-issues-with-filter-and-map-used-in-conjunction-f814da71faf

From: https://hackernoon.com/solving-performance-issues-with-filter-and-map-used-in-conjunction-gs4l365p



推荐阅读
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 如何在 Node.js 环境中将 CSV 数据转换为标准的 JSON 文件格式? ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文深入解析了 jQuery 中用于扩展功能的三个关键方法:`$.extend()`、`$.fn` 和 `$.fn.extend()`。其中,`$.extend()` 用于扩展 jQuery 对象本身,而 `$.fn.extend()` 则用于扩展 jQuery 的原型对象,使自定义方法能够作为 jQuery 实例的方法使用。通过这些方法,开发者可以轻松地创建和集成自定义插件,增强 jQuery 的功能。文章详细介绍了每个方法的用法、参数及实际应用场景,帮助读者更好地理解和运用这些强大的工具。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 解决lib-flexible安装过程中遇到的错误问题
    在安装 lib-flexible 时,遇到了 `saveError ENOENT: No such file or directory` 错误,具体表现为无法打开 `E:\Github\SDIO\package.json` 文件。解决此问题的关键在于确保项目根目录下存在 `package.json` 文件,并且在正确的项目路径中执行安装命令。建议先检查项目结构,确认文件是否存在,然后再尝试重新安装依赖。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
author-avatar
mobiledu2502891487
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有