ES5数组拓展

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)
},[])
}
//这里是一项一项地去合并,如果是数组拍平再合并。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容