• js中的数组


    准备写一系列的文章记录做题的同时,与学习到的知识融汇贯通,没事的时候可以拿出来看看。

    1.题目:查找数组元素位置

    输入:[ 1, 2, 3, 4 ], 3
    返回 位置,如果没有找到返回-1

    思路:最开始想到的就是for循环之后判断是否有这个数值,这也证明了基础相当的不牢靠,js中有相关的方法indexOf,直接拿arr.indexOf(item)就能直接返回位置。

    高程3中(95页),记录了两个方法,indexOf()和lastIndexOf(),他们都是接受两个参数,要查找的数组和查找起点的位置,一个从开始算,一个从最后开始算,没有找到返回-1.题目中是全局查找,所以,第二个参数可以不填(查找起点的位置)。

    一个栗子:

    var arr = [1,2,3,4,5];
    
    arr.indexOf(2);
    arr.indexOf(7)
    
    //返回 1
    //返回 -1

    也可以使用forEach循环来解题。

    关于forEach(96页),迭代[dié dài]方法中记录了5个方法。他们都接受两个参数,1需要运行的函数方法,2运行这些函数的作用域对象(表示this指向,个人理解,this指向的当前的作用域,如果没有会向上找),然后就是函数啦。运行的函数方法接受三个参数:1.数组中的所有值(相当于for循环中的【i】每一个数组的值,这样理解),2.数组中的位置,3.数组本身,知道了具体使用方法,看看他们的兄弟,以及他们的方法。

    every():简单的说就是对数组进行判断,如果数组中的值与我们设定的条件都满足,那么就会返回true。

    栗子:

    var arr = [1,2,3,4,5];
    var items = arr.every(function(item,index,arr){
       //item表示每一个数组里面的值 
       return item > 2
    })
    console.log(items)
    //返回false  ,因为里面有两个返回false,1 2 都是小于等于2
    //如果数组中有一个为空,还是会返回 true
    //没有值 [1,2,3,'',5],undefind,'xxx'字符串,设定条件为大于0,就会返回false

    filter():这个就是把数组中的值进行判断,如果这些值有些返回true的话,那么就返回true的集合(array);通常用来进行过滤。

    栗子:

    var arr = [1,2,3,4,5];
    var items = arr.filter(function(item,index,arr){
       return item > 2 
    })
    
    console.log(items)
    
    //返回 [3,4,5]
    //数组有空或者没有值,undefined,‘xxx’,就会直接忽略
    //如:[1,2,3,,5],[1,2,3,'',5]
    //打印返回 [1,2,3,5]

    forEach():原话是对数组中的每一项运行给定函数,方法没有返回值。简单点,就是这数组的每一个值都会被一个function方法过一遍,function的中方法自定义,返回也自定义,是最自由的一个方法。参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

    栗子:

    var arr = [1,2,3,4,5];
    var num = [];
    arr.forEach(function(item,index,arr){
       if(item > 2){
           num.push(item)
       }
    })
    console.log(num)
    
    //返回 [3,4,5]
    // 需要注意的是,它只接受数值,
    //undefined,空,或者没有值返回也是不一样的
    1,2,3,,5,直接打印返回[1,2,3,5]
    1,2,3,'',5 返回 [1,2,3,,5]
    1,2,3,undedined,5 返回 [1,2,3,undefined,5]

    map():改方法与forEach差不多,但是它是有返回值的,返回调用方法结果值的数组。

    栗子:

    var arr = [1,2,3,4,5]
    var items = arr.map(function(item,index,arr){
       return item *2
    })
    
    console.log(items)
    
    //返回 [2, 4, 6, 8, 10]

    //[1,,3,4,5] 返回 [2, undefined × 1, 6, 8, 10]
    //[1,'',3,4,5] 返回 [2, 0, 6, 8, 10]
    //[1,'xx',3,4,5] 返回 [2, NaN, 6, 8, 10]
    //[1,undefined,3,4,5] 返回 [2, NaN, 6, 8, 10]

    some:():方法同上,只是如果与设定的判断中有一个是true,那么就返回true

    栗子:

    var arr = [1,2,3,4]
    var items = arr.some(function(item,index,arr){
      return item>3
    })
    console.log(items)
    
    //返回 true
    //传啥只要一个返回ture 就返回 true 省心!!!

    上面几种遍历数组的方式都不能修改原数组的。需要变量来存储。

    其实,在写这些方法的时候,我又想到几个方法来解这个问题。

    1.那么先看every方法,pass,只返回true或false,无法拓展

    2.fllter,过滤这个方法,是可以不过需要借助indexOf

    demo:

    //我们传入的值
    var num = 1;
    
    var arr = [1,2,3,4,5];
    var items = arr.filter(function (item,index,arr) {
        if(item === num){
            console.log(arr.indexOf(num))
            return arr.indexOf(num);
        }else{
            console.log(-1);
            return -1;
        }
    })
    
    //返回 0 
    //返回 4个 -1
    这不是我们希望的结果

    修改了一下,参考了别人的代码

    var num = 2;
    var fa = -1;
    var arr = [1,2,3,4,5];
    var items = arr.filter(function (item,index,arr) {
        if(item === num && fa === -1){
            fa = index
        }else{
            return -1
        }
        console.log(fa)
    })
    只返回一个位置,num=2,返回1,跟我们的结果一样。

    那么,forEach,map也是同样的可以用这种方法进行判断。

    不过还是要用js自带的indexOf方法,不是因为别的,写的太多,不够装逼啊!!!

  • 相关阅读:
    算法·进阶石
    How can I determine whether a 2D Point is within a Polygon?
    直线射线线段的相交判断
    关于时间的感想
    企业级自定义表单引擎解决方案(七)--视图模型管理
    GB28181安防Web无插件流媒体平台LiveGBS如何配置集群部署增加并发播放和录像
    接口测试之object []如何类型传参
    Excel2010工作簿被锁定,无法复制或者新增加sheet表格。
    drawio下载
    alsa-amixer-api
  • 原文地址:https://www.cnblogs.com/damai/p/7296349.html
Copyright © 2020-2023  润新知