美文网首页
ES5数组拓展

ES5数组拓展

作者: 流着万条永远的河 | 来源:发表于2017-09-05 19:19 被阅读0次

    Array.isArray(obj)是不是数组,判断!

    这是一个Array对象的一个静态函数,判断一个对象是不是数组的。

    var a = []
    undefined
    var b = new Date()
    undefined
    console.log(Array.isArray(a))
     true
    undefined
    console.log(Array.isArray(b))
     false
    undefined
    

    .indexOf(element) / .lastIndexOf(element)查找一个值有木有在数组里

    indexOf从头至尾搜索,lastIndexOf反向搜索。
    查找到第一个后,返回其引索,没有找到返回-1。

    var arr =[3,4,'hello','haha']
    undefined
    arr.indexOf('haha')
    3
    arr.indexOf('ha')
    -1
    arr.lastIndexOf('haha')
    3
    arr.splice(1,0,8,8,8,)
    []
    arr
    (7) [3, 8, 8, 8, 4, "hello", "haha"]
    arr.indexOf(8)
    1
    arr.lastIndexOf(8)
    3
    

    如果没有这个函数命令,单独去自己写呢?

    function hasWord(arr,item){
      for(var i =0;i<arr.length;i++){
        if( arr[i] === item)
              return i
    } 
             return -1
    }
    hasWord(arr,8)
    1
    

    数组的遍历.forEach(element,index,array)

    遍历是为了让每一个元素扩展性更强,操作性更方便,相当于放到函数角度看问题了。
    遍历数组,参数为一个回调函数,回调函数有三个参数:

    • 当前元素
    • 当前元素索引值
    • 整个数组
    arr.forEach(function(){
    console.log(arguments)
    })
    

    可以知道forEach的三个参数的顺序:元素,位置,数组。

    var arr =[3,4,'hello','haha']
    arr.forEach(function(){
    console.log(arguments)
    })
     (3) [3, 0, Array(4), callee: function, Symbol(Symbol.iterator): function]
     (3) [4, 1, Array(4), callee: function, Symbol(Symbol.iterator): function]
     (3) ["hello", 2, Array(4), callee: function, Symbol(Symbol.iterator): function]
     (3) ["haha", 3, Array(4), callee: function, Symbol(Symbol.iterator): function]
    arr.forEach(function(value,index){
            console.log(value + '' + value )
    })
     33
     44
     hellohello
     hahahaha
    
    用for循环呢?
    for(var i=0;i<arr.length;i++){
          arr[i] = arr[i]+''+arr[i]
    }
    "hahahaha"
    arr
    (4) ["33", "44", "hellohello", "hahahaha"]
    

    .every(function(element,index,array))/.some(function(element,index,array))数组中的元素满足什么条件,返回真或假

    • every所有函数的每个回调函数都返回真才返回真,遇到假就终止执行返回假。
    • some函数存在一个回调函数返回真才终止执行,返回真,否则返回假。
    var arr =[3,4,-1,0,5]       //是否全是正数?
    arr.every(function(element,i){
          if(arr[i]>0)  
          return true  
    })
    false
    或者是:
    arr.every(function(val){
           return val>0?true:false
    })
    false
    
    如果我想知道数组里有木有正数?
    arr.some(function(val){
          return val>0?true:false
    })
    true
    

    .map(function(element))遍历数组,回调函数返回值组成新数组返回

    新数组与原数组索引结构一样,原数组不变。

    var arr =[1,2,3,4,5,6]     //我想要新数组是原数组的元素的平方
    var a = arr.map(function(val){
      return val*val
    })
    a
    (6) [1, 4, 9, 16, 25, 36]
    

    .filter(function(element))数组的过滤

    返回数组的一个子集,回调函数判断是否返回,返回true的元素加入到返回数组中,索引缺失的不包括在新数组中------原数组不变。

    var arr=[3,5,6,-1,-2,-3]
    var a =arr.filter(function(val){
        return val>0
    })
    a
    (3) [3, 5, 6]
    arr
    (6) [3, 5, 6, -1, -2, -3]      //过滤正数
    
    var students=[{
        name:'a',
        age:10
    },
    {
        name:'b',
          age:20
    },
    {
        name:'ce',
          age:8
    },
    {
          name:'dd',
            age:5
    }
    ]                         //过滤出学生里年纪大于18的?
    var stu18 =students.filter(function(val){
          return val.age>18
    })
    stu18
    [{name:'b',  age:20}]  (length=1)//length值是在原数组中的值。
    
    如果想要知道学生名字里有c的:
    var namehasc =students.filter(function(val){
        return val.name.indexOf('c')>-1
    })
    namehasc
    [{name:'ce',age:8}]  //这里的indexOf用的是字符串那里的搜索,不是这里的。
    

    reduce(function(v1,v2),value)/reduceRight(function(v1,v2),value)元素作用后得到新元素,新元素再跟下一个原数组的元素继续作用

    var arr =[3,4,5]    //我想要一个累加的结果
    arr.reduce(function(v1,v2){
          return v1+v2                             
    })
    12
    

    刚开始,遍历,v1=3,v2=4,得到7;
    再遍历,v1=7,v2=5,得12。
    这里有一个初始值参数value——

    arr.reduce(function(v1,v2){
        return v1+v2
    },100)
    112    //刚开始v1=100,v2=3,然后以此类推,,,
    

    如何手写,实现reduce的功能呢?

    var arr=[3,4,5,6]
    function reduce(arr,fn,initval){
    }
    var result=reduce(arr,function(){
              v1+v2
    },10)
    先不去管初始值:
    function reduce(arr,fn){
          var arr2=arr
      while(arr2.length>1){
                  console.log(arr2)
                  arr2.splice(0,2,fn(arr2[0],arr2[1]))
    }
    return arr2[0]
    }
    
    var arr=[3,4,5,6]
    
    var result=reduce(arr,function(v1,v2){
            return  v1+v2
    })
     (4) [3, 4, 5, 6]
    (3) [7, 5, 6]
     (2) [12, 6]
    
    console.log(result)
     18       //但是原数组改变了,不是我想要的。这时候arr2=arr.concat([]),深拷贝。
    
    如果有初始值呢?就相当于arr2=[initvalue,3,4,5,6]——
    
    function reduce(arr,fn,initValue){
          var arr2=arr.concat([])
    if(initValue !== undefined){
        arr2.unshift(initValue)
    }                                            //判断初始值有木有:不要直接写if(initValue),如果是0或者null,也是false。
      while(arr2.length>1){
                  console.log(arr2)
                  arr2.splice(0,2,fn(arr2[0],arr2[1]))
    }
    return arr2[0]
    }
    var arr=[3,4,5,6]
    var result=reduce(arr,function(v1,v2){
            return  v1+v2
    },10)
    
    
    console.log(result)
    
    

    把一个数组给拍平

    var arr=[3,['4,5',7,[1]],[2,10]]
    function flat(){
    }
    var arr2 = flat(arr)
    console.log(arr2)     //[3,'4,5',7,1,2,10]就是这个意思,拍平。那怎么办呢?
    递归:
    function flat(arr){
      var arr2=[]
     arr.forEach(function(val){
          if(Array.isArray(val)){
              arr2 = arr2.concat(flat(val))
    }else{
            arr2.push(val)
    }                
    })
    return  arr2
    }
    var arr2=flat(arr)
    arr2
    (6) [3, "4,5", 7, 1, 2, 10]
    
    另一种思路:flat就是把value变成一个值。
    function flatten(arr){
    var newArr=[]
    function flat(arr){
        arr.forEach(val>={
          if(Array.isArray(val)){
              flat(val)     
    }else{
            newArr.push(val)
    }
    })
    }
    flat(arr)
    return newArr
    }
    
    还有一个方法:
    function flatten2(arr){
        return arr.reduce(function(initArr,curentArr){
          return initArr.concat(Array.isArray(currentArr)flatten2(currentArr):currentArr)
    },[])
    }
    //这里是一项一项地去合并,如果是数组拍平再合并。
    

    反正基本思路,肯定是要用递归把嵌套的拍平的,然后拍平后,如何结合,各凭本事了哦。

    相关文章

      网友评论

          本文标题:ES5数组拓展

          本文链接:https://www.haomeiwen.com/subject/jweujxtx.html