Array数组之知其然知其所以然

239 阅读3分钟

数组是什么

数据就是原型链中有 Array.prototype 的对象

如果给数组添加其他属性

let a=[1,2,3]
a.name='name'
for( let i=0 i<a.lenght i++){
    console.log(a[i])
}   
//1,2,3
  • 不会遍历出key不是数字的属性,因为我们人为的设定i=0,i++,只会遍历到下标记key为数字的属性
for(let key in a){
    console.log(key)
}
// 1,2,3,name
  • for...in把a中的全部属性打印出来

数组常用API


forEach

  • forEach() 方法对数组的每个元素执行一次提供的函数,没有返回值
array.forEach(callback(value, key, arr){
    //do something
}, this)
//arr,this可选
-----------------------------------------------------------------
array.forEach( function(value,key){
    //do some thing
})
  • forEach用this传参给里面的函数调用 ,所以array.forEach(function(value,key){//do something})能够遍历array
  • a.forEacj中的函数接受3个参数 arr.value,arr.key,arr自己,第三个可以省略,下面2行代码相等
array.forEach(function(value,key){})
array.forEach.call(this,function(value,key ){})
  • 我们可以自己手写一个forEach
let foo={0:'a',1:'b',length:2}
foo.forEach=function(fn){
    for(let i = 0;i < foo.length; i++){
        fn(this[i],i)       //foo的每一项都调用一下fn
    }
}

map

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

  • 基本等于foreachm,有返回值
  • 速度比foreach快,不会对原数组产生影响

fillter

过滤器:filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素

array.filter(function(currentValue,index,arr){
    
}, thisValue)
//thisValue可选。对象作为该执行回调时使用,传递给函数,用作 this 的值。如果省略了 thisValue ,this 的值为"undefined
let array=[1,2,3,4,5,6,7,8,9,10]
array.fillter(function(value,key){
    return value >= 5
})
//[5,6,7,8,9,10]

sort

用于排序数组,排序后,原数组将被改变

  • 数组里面是数字的话,sort里的比较函数可以简单的写成
  • 如果是字符串等,就不确定了,自己试一下a-b或者b-a
arr.sort(function (a, b) { 
  return a - b;
})
//a-b升序,b-a降序

concat

concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。

let array = [1,2]
array.concat(3,4)
//[1,2,3,4]
  • 如果数组成员包括对象,concat方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是新数组拷贝的是对象的引用
let obj = { a: 1 };
let array = [obj];
let newArray = array.concat();

obj.a = 2;
newArray[0].a
// 2
  • 用来复制一个数组
let array = [1,2,3]
let newarray=array.concat([])
console.log(newarray)
//[1,2,3]

reduce

reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,最后返回单个值。

arr.reduce(function(a, b, c, d){},e)

a:累加器的返回值,上一次的结果
b:当前处理的元素,现在
c:当前处理的元素的索引,第一次处理时,如果提供了初始值,则为0,没有提供则为1,可选
d:d:arr自己本身,可选
e:初始值,如果没有指定,则arr中的第一个值为初始值,可选
let arr=[1,2,3,4]
arr.reduce((prev, curr) => prev + curr )
//10

reduce可以表示map

a = [1,2,3]
a.reduce(function(arr,n){
    arr.push(n*2)
    return arr
},[])
//[2,4,6]
//每一项平方

reduce可以表示filter

a = [1,2,3,4,5,6,7,8,9,10]
a.reduce(function(arr,n){
    if(n % 2 === 0){
        arr.push(n)
    }
    return arr
},[])
//[2,4,6,8,10]

join

join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串

  • 默认为arr.join(',')
var a = [1, 2, 3, 4];

a.join(' ') // '1 2 3 4'
a.join(' | ') // "1 | 2 | 3 | 4"
a.join() // "1,2,3,4"