JS从零开始(32)

125 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情

数组的遍历方法(续)

除了用reduce()方法求和之外,我们还可以用它来求数组元素中的最大值,如:

        //求最大值
        var array1 = [1, 3, 6, 4, 8, 2, 0, 8, 9];
        var result = array1.reduce(function (pre, cur) {
            if (pre > cur) {
                cur = pre;
            };
            return cur;
        });
        console.log(result);//9

解释:依次将数组中的元素传递到function函数参数中,如果前者大于后者,那么便将大者赋值给小者,再返回大者,然后又将大者与后面的数组元素做对比,以此类推得到最大值。

其实这里我们可以使用之前讲过的三元表达式来写代码,更简洁方便,如:

        //求最大值
        var array1 = [1, 3, 6, 4, 8, 2, 0, 8, 9];
        var result = array1.reduce(function (pre, cur) {
            return pre > cur ? pre : cur;
        });
        console.log(result);//9

其结果是一样的。

举一反三: 如果这里我们要求最小值又该如何做呢?

几个数组练习题:

1.去除数组中相同的元素,使用方法:splice() 这个方法我们之前讲过,是删除数组中指定内容,需要传递两个参数,一个是数组元素下标,一个是删除个数,下面我们来看。

var array2 = [6, 3, 6, 8, 8, 3, 0, 1, 2, 1, 9 ];
//var num = array2.length;
for (var i = 0; i <= array2.length; i++) {
  for(var j = i + 1; j <= array2.length; j++) {
      if (array2[i] == array2[j]) {
          array2.splice(j, 1);
          j--;
      };
  };  
};
console.log(array2);//[6,3,8,0,1,2,9]

解释:这里用到了双重for循环,其实也就是为了让数组中的两个元素进行对比,如果这两个元素相等,那么将删除数组下标为j的元素,注意,这是侯数组会自动补齐空位,所以这里我们需要将j--,然后进行下一次循环j++才能将空位那里补上来的元素再进行一次对比,不然会漏掉!

这里我还要提一下,js引擎是基于事件驱动的单线程执行,所以上面的代码如果是这样写

image.png

那么就会导致浏览器卡死,为什么呢? 因为我们在这样写代码时,相当于创建了一个线程,代码里面的变量不能引用外面的,也就是num这个变量,必须把变量(array2.length)定义在里面才行