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é)合,各憑本事了哦。