for,forEach,map,filter遍历效率之前端性能优化

关于前端性能优化有很多种方式,这里想谈谈算法中最常用的遍历的优化,其实以前我一直认为遍历效率的提升没有多大,但是看到实际数据后觉得这块的优化应该是实用性非常高的
下面通过一个例子来对比几者之间的差别

现有需求:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

1.for

var twoSum = function(nums, target) {
    var temp;
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums.length; j++) {
            if (nums[i] + nums[j] === target && i !== j) {
                temp = [j, i];
            }
        }
    }
    return temp;
};

在这里插入图片描述

2.forEach

var twoSum = function(nums, target) {
    var temp;
    nums.forEach((num1, index1) => {
        nums.forEach((num2, index2) => {
            if (num1 + num2 === target && index1 !== index2) {
                temp = [index2, index1];
            }
        }) 
    });
    return temp;
};

在这里插入图片描述
3.filter

var twoSum = function(nums, target) {
    var temp;
    for (let i = 0; i < nums.length; i++) {
        let want = target - nums[i];
        nums.filter((e, ii) => {
            if (e === want && ii !== i) { 
                temp = [ii, i];
            }
        });
    }
    return temp;
};

在这里插入图片描述
在这里将want变量直接放入循环中从而减少一个块级作用域变量定义

var twoSum = function(nums, target) {
    var temp;
    for (let i = 0; i < nums.length; i++) {
        nums.filter((e, ii) => {
            if (e === target - nums[i] && ii !== i) { 
                temp = [ii, i];
            }
        });
    }
    return temp;
};

发现其执行时间有小幅度增加,而内存消耗并未减少
在这里插入图片描述

4.map

var twoSum = function(nums, target) {
     var temp;
     nums.map((num1, index1) => {
         nums.map((num2, index2) => {
             if (num1 + num2 === target && index1 !== index2) {
                 temp = [index2, index1];
             }
         }) 
     });
     return temp;
};

在这里插入图片描述

var twoSum = function(nums, target) {
     var temp;
     nums.forEach((num1, index1) => {
         nums.map((num2, index2) => {
             if (num1 + num2 === target && index1 !== index2) {
                 temp = [index2, index1];
             }
         }) 
     });
     return temp;
};

即使将其中一个循环替换为for或者forEach遍历,其实际影响也不大
在这里插入图片描述
对比几种遍历方式后发现几者的效率是 for > filter > forEach > map
由此得知

1.我们可以在其实际应用的情况下将map更换为filter,其也同样返回一个满足条件的数组对象,并且其性能与for循环接近

2.尽量减少遍历中数学方法计算的执行

ps:(如果页面中log过多的话,去除程序中多余的log对性能提升也有帮助)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaScript中有多种方法可以遍历数组,其中常用的有mapforEachfilter。 1. map方法: map方法对数组中的每个元素调用一个回调函数,并返回一个新的数组,新数组的元素是原始数组中每个元素经过回调函数处理后的结果。例如,我们有一个数组[1, 2, 3],我们可以使用map方法将每个元素乘以2并返回一个新的数组[2, 4, 6]。map方法不改变原始数组。 2. forEach方法: forEach方法对数组中的每个元素调用一个回调函数,但它不返回任何内容。通常,forEach方法用于执行一些操作而不需要返回结果,例如打印数组中的每个元素。与map方法不同,forEach方法无法返回修改后的数组。 3. filter方法: filter方法对数组中的每个元素调用一个回调函数,并返回一个新的数组,新数组的元素是回调函数返回值为true的元素。例如,我们有一个数组[1, 2, 3, 4, 5],我们可以使用filter方法筛选出所有大于2的元素并返回一个新的数组[3, 4, 5]。与map方法类似,filter方法也不改变原始数组。 这三种方法在遍历数组时具有不同的用途。map方法可以用于对数组中的每个元素进行转换或操作,并返回一个新的数组。forEach方法用于执行一些操作而不关心返回值。filter方法用于根据指定的条件筛选出符合条件的元素,并返回一个新的数组。根据具体情况,我们可以选择合适的方法来遍历数组。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值