关于数组

创建数组两种方式: 

var arr = new Array(num);// num 可以为空

直接创建:

var arr = [];

数组常用方法:

改变原数组:

push、pop、shift、unshift、splice、sort、reverse

push 数组最后一位添加,可以push多个值,返回值为数组长度;

var arr = [1,2,3,4];
var len = arr.push(1,2); 
console.log(arr,len); // arr = [1,2,3,4,1,2]; len = 6;

push函数仿写:

        Array.prototype.myPush = function (){
            for(var i = 0; i < arguments.length; i++){
                this[this.length] = arguments[i];
            }
            return this.length;
        }

pop 将数组最后一位剪切,一次只能一个,返回值为被剪切的值;

var arr = [1,2,3,4];
var value = arr.pop();
console.log(arr,value);// arr = [1,2,3]; value = 4;

pop函数仿写:

        Array.prototype.myPop = function () {
            var last = this[this.length - 1];
            this.length = this.length - 1;
            return last;
        }

shift 将数组第一位进行剪切,一次只能一个,返回值为被剪切的值;

var arr = [1,2,3,4];
var value = arr.shift();
console.log(arr,value);// arr = [2,3,4]; value = 1;

unshift 在数组第一位添加,可以unshift多个值,返回值为数组长度;

var arr = [1,2,3,4];
var len = arr.unshift(666,888);
console.log(arr,len); // arr = [666,888,1,2,3,4]; len = 6;

  unshift函数仿写:

        Array.prototype.myUnshift = function () {
            var arr = [];
            for(var i = 0; i < this.length; i++){
                arr[i + arguments.length] = this[i];
            }
            for(var i = 0; i < arguments.length; i++){
                arr[i] = arguments[i];
            }
            for(var i = 0; i < arr.length; i++){
                this[i] = arr[i];
            }
            return this.length;
        }

splice 截取数组长度,在切口处添加的新数据; splice(arr[i], spliceArr.len, newValue);

var arr = [1,2,3,4,5,6];
var spliceArr = arr.splice(2,3,'222');
console.log(arr,spliceArr); // arr = [1,2,'222',6]; spliceArr = [3,4,5];

注意:arr[i] 可为负数;

splice函数仿写,可能复杂了……

Array.prototype.mySplice = function () {
            var arr = [];
            var newArr = [];
            if(arguments.length == 0){
                arguments[0] = 0;
                arguments[1] = 0;
            }else if(arguments.length == 1){
                arguments[0] = arguments[0] >= 0 ? arguments[0] : arguments[0] + this.length;
                arguments[1] = this.length - arguments[0];
            }
            arguments[0] = arguments[0] >= 0 ? arguments[0] : arguments[0] + this.length;
            //  arr 截取数组
            var len = arguments[1] <= this.length ? arguments[1] : this.length - arguments[0];
            for(var i = 0; i < len;i++){
                arr[i] = this[arguments[0] + i];
            }
            //  截取后数组Arr拼合
            //  前
            for(var i = 0; i < arguments[0]; i++){
                newArr[i] = this[i];
            }
            //  插入
            for(var i = 0; i < arguments.length - 2; i++){
                newArr[arguments[0] + i] = arguments[i + 2];
            }
            // 后
            for(var i = 0; i < this.length - arguments[0] - arguments[1]; i++){
                newArr[arguments[0] + arguments.length - 2 + i] = this[arguments[0] + arguments[1] + i];
            }
            // 将新数组重新赋值给 this
            this.length = newArr.length;
            for(var i = 0; i < newArr.length; i++){
                this[i] = newArr[i];
            }
            return arr;
        } 

sort  排序,按asc码进行排序,返回结果为处理后的新数组;

var arr = [1,15,13,4,33,5,6];
var retArr = arr.sort();
console.log(arr,retArr); // arr = [1,13,15,33,4,5,6]; retArr = [1,13,15,33,4,5,6];

sort(func)

 1、必须有两个形参 

2、看返回值;返回值为负数,则前面的数在前;返回值为正数,则后面的数在前;为0,则不动;

var arr = [1,2,12,3,4,5,6];
// 循环执行arr.length - 1 次操作
arr.sort(function(a,b){
    console.log(a,b); //(1,2);(2,12);(12,3);(3,4);(4,5);(5,6);
})

 

例:按大小升序排列

 

var arr = [1,2,12,3,4,5,6];
// 按大小升序;
arr.sort(function(a,b){
    return a - b;
})

给一个有序的数组乱序

var arr = [1,2,3,4,5,6,7,8,9];
arr.sort(function(a,b){
    return (Math.random() - 0.5);
})
console.log(arr); // 它是乱的

注意:asc码比较,逐位比较;

reverse 颠倒数组中的元素顺序;

var arr = [1,2,3,4,5,6];
var retArr = arr.reverse();
var isTrue = retArr === arr;
console.log(arr,retArr,isTrue); //arr = [6,5,4,3,2,1];  retArr = [6,5,4,3,2,1]; true;

reverse函数仿写:

        Array.prototype.myReverse = function () {
            var arr = [];
            for(var i = 0; i < this.length; i++){
                arr[i] = this[this.length - i - 1];
            }
            for(var i = 0; i < this.length; i++){
                this[i] = arr[i];
            }
            return this;
        }

注意:未生成新数组;

未改变原数组:

concat、join、toString、slice

concat 连接两个数组;

var arr = [1,2,3], arr1 = [4,5,6];
var newArr = arr.concat(arr1);
console.log(arr,arr1,newArr); // arr = [1,2,3]; arr1 = [4,5,6]; newArr = [1,2,3,4,5,6];

concat函数仿写:

Array.prototype.myConcat = function () {
            var newArr = [];
            var len = this.length;
            for(var i = 0; i < len; i++){
                newArr[i] = this[i];
            };
            len = newArr.length;
            for(var i = 0; i < arguments.length; i++){
                var tp = Object.prototype.toString.call(arguments[i]);
                if(tp == '[object Array]'){
                    for(var j = 0; j < arguments[i].length;j ++){
                        newArr[len] = arguments[i][j];
                        len = newArr.length;
                    }
                }else {
                    newArr[len] = arguments[i];
                    len = newArr.length;
                }
            }
            return newArr;
        }

join 数组变字符串;join参数为连接字符串;

var arr = [1,2,3];
var str = arr.join('.');
console.log(arr,str); // arr = [1,2,3]; str = '1.2.3';

join函数仿写:

        Array.prototype.myJoin = function () {
            var str = '';
            var join = arguments.length === 0 ? ',' : arguments[0];
            for(var i = 0; i < this.length - 1; i++){
                str += this[i] + join;
            }
            str += this[this.length - 1]; 
            return str;
        }

slice 从i位开始截取,截取到j位;

var arr = [1,2,3,4,5,6];
var arr1 = arr.slice(-3,-2);
console.log(arr,arr1); // arr = [1,2,3,4,5,6]; arr1 = [4];

slice函数仿写:

Array.prototype.mySlice = function () {
            var len = this.length;
            var arr = [];
            if(arguments.length == 0){
                arguments[0] = 0;
                arguments[1] = len;
            }else if(arguments.length == 1){
                if(Math.abs(arguments[0]) > len){
                    arguments[0] = arguments[0] >= 0 ? len : 0;
                }else{
                    arguments[0] = arguments[0] >= 0 ? arguments[0] : arguments[0] + len;
                }
                arguments[1] = len;
            }else{
                if(Math.abs(arguments[0]) > len){
                    arguments[0] = arguments[0] >= 0 ? len : 0;
                }else{
                    arguments[0] = arguments[0] >= 0 ? arguments[0] : arguments[0] + len;
                }
                if(Math.abs(arguments[1]) > len){
                    arguments[1] = arguments[1] >= 0 ? len : 0;
                }else{
                    arguments[1] = arguments[1] >= 0 ? arguments[1] : arguments[1] + len;
                }
            }
            for(var i = 0; i < arguments[1] - arguments[0]; i++){
                arr[i] = this[arguments[0] + i];
            }
            return arr;
        }

toString 返回值与没有参数的 join() 方法返回的字符串相同。

var arr = [1,2,3,4,5,6];
var str = arr.toString();
console.log(arr,str); // arr = [1,2,3,4,5,6]; str = '1,2,3,4,5,6';

ES5新增方法:

indexof、lastIndexof

indexof 两个参数 arr[index] 和 searchBeginIndex(若未填写,则从零开始);若存在,返回第一个index值;若不存在,返回-1;

        var arr = [1,2,3,4,5,6,7,5,7,5];
        var index = arr.indexOf(5);
        var isExsit = arr.indexOf(2,4);
        console.log(index,isExsit + '不存在的'); // index = 4; isExist = -1;

lastIndexof 两个参数arr[index] 和searchBeginIndex(若未填写,则从arr.length - 1 位开始); 若存在,返回第一个index值;若不存在,返回 -1;

    var arr = [1,2,3,4,5,6,7,5,7,5];
    var index = arr.lastIndexOf(5);
    var isExsit = arr.lastIndexOf(2,4);
    console.log(index,isExsit);  // index = 9; isExsit = 1; 从index = 4 开始,向前找值为2的索引;

foreach、filter、map、some、every

foreach(func) func函数有三个参数 ele,index,arr;

var newArr = arr.forEach(function(ele,index,arr){
  console.log(ele,index,arr);// ele = 1; index = 0; arr = [1,2,3]; ...
}) // newArr = undefined

foreach 源码仿写

        Array.prototype.myForEach = function(func){
            for(var i = 0; i < this.length;i++){
                func(this[i],i,this);
            }
        }

filter(func) func函数有三个参数,ele,index,arr;对数组中数值进行筛选,return值为true,插入到新数组中;

    var newArr = arr.filter(function(ele,index,arr){
        console.log(ele,index,arr); // ele = 1; index = 0; arr = [1,2,3]; ...
        if(index % 2 == 0){
            return true;
        }
    })
    console.log(newArr); // newArr = [1,3];

filter源码仿写

    Array.prototype.myFilter = function(func){
        var newArr = [];
        for(var i = 0; i < this.length; i++){
            var target = {};
            if(func(this[i],i,this)){
                if(this[i] && typeof this[i] == 'object'){
                    deepClone(target,this[i]);
                    newArr.push(target);
                }else{
                    newArr.push(this[i]);
                }
            }
        }
        return newArr;
    }

map(func) func函数的三个参数,ele,index,arr;返回值的集合;

    var arr = [1,2,3];
    var newArr = arr.map(function(ele,index,arr){
        return 'this is a map';
    })
    console.log(newArr);// newArr = ['this is a map','this is a map','this is a map'];

map源码仿写

    Array.prototype.myMap = function(func){
        var newArr = [];
        for(var i = 0; i < this.length; i++){
            if(func(this[i],i,this)){
                newArr.push(func(this[i],i,this));
            }
        }
        return newArr;
    }

some(拥有你便拥有全世界)every(一个都不能少)

    var arr = [1,2,3];
    var result = arr.some(function(ele,index,arr){
        return ele > 2;        
    })
    console.log(result); // true
    var result1 = arr.every(function (ele, index, arr) {
        return ele > 2;
    })
    console.log(result1); // false

some/every源码:

    Array.prototype.mySome = function (func) {
        for(var i = 0; i < this.length; i++){
            if(func(this[i],i,arr)){
                return true;
            }
        }
    }
    Array.prototype.myEvery = function (func){
        var count = 0;
        for(var i = 0; i < this.length; i++){
            if(func(this[i],i,arr)){
                count++;
            }
        }
        return count = count=== this.length ? true : false;
    }

reduce、reduceRight

reduce(func) func的三个参数prevValue ,ele, index

    var arr = [1,2,3,4,5,7];
    var newArr = arr.reduce(function(prevValue,ele,index){
        console.log(prevValue,ele); // (0,1) (1,2) (3,3) (6,4) ...
        return ele + prevValue;
    },0);
    console.log(newArr); //newArr = 22;

reduceRight(func) func 从len - 1 开始遍历

    var arr = [1,2,3,4,5,6];
    var newArr = arr.reduceRight(function(prevValue,ele,index){
        console.log(prevValue);// 6, 11, 15, 18, 20
        return prevValue + ele;
    },0);
    console.log(newArr); // 21;

reduce源码仿写:

    Array.prototype.myReduce = function(func,init){
        var prev = init,
            i = 0,
            len = this.length;
        if(init === undefined){
             prev = this[0];
             i = 1;
        }
        for(i; i < len; i++){
            prev = func(prev,this[i],i);
        }
        return prev;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值