ES5數(shù)組拓展

Array.isArray(obj)是不是數(shù)組,判斷!

這是一個Array對象的一個靜態(tài)函數(shù),判斷一個對象是不是數(shù)組的。

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)查找一個值有木有在數(shù)組里

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

如果沒有這個函數(shù)命令,單獨去自己寫呢?

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

數(shù)組的遍歷.forEach(element,index,array)

遍歷是為了讓每一個元素擴(kuò)展性更強,操作性更方便,相當(dāng)于放到函數(shù)角度看問題了。
遍歷數(shù)組,參數(shù)為一個回調(diào)函數(shù),回調(diào)函數(shù)有三個參數(shù):

  • 當(dāng)前元素
  • 當(dāng)前元素索引值
  • 整個數(shù)組
arr.forEach(function(){
console.log(arguments)
})

可以知道forEach的三個參數(shù)的順序:元素,位置,數(shù)組。

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循環(huán)呢?
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))數(shù)組中的元素滿足什么條件,返回真或假

  • every所有函數(shù)的每個回調(diào)函數(shù)都返回真才返回真,遇到假就終止執(zhí)行返回假。
  • some函數(shù)存在一個回調(diào)函數(shù)返回真才終止執(zhí)行,返回真,否則返回假。
var arr =[3,4,-1,0,5]       //是否全是正數(shù)?
arr.every(function(element,i){
      if(arr[i]>0)  
      return true  
})
false
或者是:
arr.every(function(val){
       return val>0?true:false
})
false

如果我想知道數(shù)組里有木有正數(shù)?
arr.some(function(val){
      return val>0?true:false
})
true

.map(function(element))遍歷數(shù)組,回調(diào)函數(shù)返回值組成新數(shù)組返回

新數(shù)組與原數(shù)組索引結(jié)構(gòu)一樣,原數(shù)組不變。

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

.filter(function(element))數(shù)組的過濾

返回數(shù)組的一個子集,回調(diào)函數(shù)判斷是否返回,返回true的元素加入到返回數(shù)組中,索引缺失的不包括在新數(shù)組中------原數(shù)組不變。

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]      //過濾正數(shù)

var students=[{
    name:'a',
    age:10
},
{
    name:'b',
      age:20
},
{
    name:'ce',
      age:8
},
{
      name:'dd',
        age:5
}
]                         //過濾出學(xué)生里年紀(jì)大于18的?
var stu18 =students.filter(function(val){
      return val.age>18
})
stu18
[{name:'b',  age:20}]  (length=1)//length值是在原數(shù)組中的值。

如果想要知道學(xué)生名字里有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)元素作用后得到新元素,新元素再跟下一個原數(shù)組的元素繼續(xù)作用

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

剛開始,遍歷,v1=3,v2=4,得到7;
再遍歷,v1=7,v2=5,得12。
這里有一個初始值參數(shù)value——

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

如何手寫,實現(xiàn)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       //但是原數(shù)組改變了,不是我想要的。這時候arr2=arr.concat([]),深拷貝。

如果有初始值呢?就相當(dāng)于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)

把一個數(shù)組給拍平

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)
},[])
}
//這里是一項一項地去合并,如果是數(shù)組拍平再合并。

反正基本思路,肯定是要用遞歸把嵌套的拍平的,然后拍平后,如何結(jié)合,各憑本事了哦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容