数组中常用的函数及算法总结

一、判断一个变量是数组还是对象

1、用instanceof运算符:用于判断引用类型数据的类型,typeof适合判断基本的数据类型,判断引用数据类型会出错

//定义一个数组
var a=[1,2,3,4];
var b={myname:"张三",age:"18"};
console.log(typeof(a)===Array);//false
console.log(a instanceof Array);//true
console.log(typeof(b)===Object);//false
console.log(b instanceof Object);//true

2、判断构造函数,一个对象的实例是通过构造函数生成的,每个实例都有_proto__属性,这个属性指向的是构造该对象的构造函数

console.log(a.constructor===Array);//true
console.log(b.constructor===Object);//true
console.log(a.__proto__.constructor==Array);//true
console.log(a.__proto__===Array.prototype);//true

3、toString()函数,不同数据类型中的toString()方法返回值不一样,借用js中的call()函数,call()函数用来调用所有者对象作为参数的方法,通过 call(),您能够使用属于另一个对象的方法。

console.log(Object.prototype.toString.call(a));//[object Array]
console.log(Object.prototype.toString.call(b));//[object Object]

二、数组遍历方法

1.通过for循环

var  arr=[2,3,6,8,0,1,3];
for(var i=0;i<arr.length;i++){
    console.log(arr[i]);
}

2、基于forEach()函数的方法,该函数接收一个回调函数

//element:数组中的元素、index:数组索引、arra:数组本身
arr.forEach(function(element,index,array){
    console.log(element);
})

3、基于map()函数,该函数也接收一个回调函数,回调函数必须有返回值,在做运算方面比较方便

var result=arr.map(function(element){
     return element;
});
console.log(result);

4、基于some()函数与every()函数的方法,some()函数遍历数组的过程中只要某个元素满足则返回true,否则返回false;every()函数是遍历数组的过程中所有元素都否和返回true,否则返回false

var result1=arr.some(function(element){
    return element>4;
})
var result2=arr.every(function(element){
    return element<3;
})
console.log(result1);//true
console.log(result2);//false

5、基于reduce()函数的方法,例如找数组中的最大值

//accumulator:上一次调用累加器的返回值;currentValue:当前值;currentIndex:当前索引;array:数组本身
var result=arr.reduce(function(accumulator,currentValue,currentIndex,array){
    return  accumulator>currentValue?accumulator:currentValue;
})
console.log(result);//8

6、基于find()函数的方法,找到第一个满足条件的值就会直接返回

var result=arr.find(function(element){
    return element;
})
console.log(result);//2

7、fifter()函数,不包含0

var result=arr.filter(function(element){
    return element;
})
console.log(result);//[ 2, 3, 6, 8, 1, 3 ]

三、数组去重

1、利用indexOf函数

var arr=[2,3,4,5,4,4,6,8,5,6];
var result=[];
for(var i=0;i<arr.length;i++){
    if(result.indexOf(arr[i])===-1){
        result.push(arr[i]);
    }
}
console.log(result);

2、利用key-value结构,不能判断Number类型和String类型的数字,因为1和“1”实际不是重复的值

var arr=[1,6,8,7,1,6,0,'1'];
    var obj = {}, result = [], val, type;
    for (var i = 0; i < arr.length; i++) {
        val = arr[i];
        type = typeof val;
        if (!obj[val]) {
            obj[val] = [type];
            result.push(val);
        } else if (obj[val].indexOf(type) < 0) {   // 判断数据类型是否存在数组中 
            obj[val].push(type);
            result.push(val);
        }
    }
 console.log(result);//[ 1, 6, 8, 7, 0, '1' ]

3、利用sort函数

var arr = [1, 6, 8, 7, 1,7, 6, 0];
var result = [];
arr = arr.sort(function (a, b) {
      return a-b;//如果a>b则交换位置,升序
});
for (var i = 0; i < arr.length; i++) {
    if (arr[i] != result[result.length - 1]) {
        result.push(arr[i]);
    }
}
console.log(result);//[ 0, 1, 6, 7, 8 ]
         

4、利用双重循环

var arr = [1, 6, 8, 7, 1,7, 6, 0];
var result = [];
for(var i=0;i<arr.length;i++){
    for(var j=i+1;j<arr.length;j++){
        if(arr[i]==arr[j]){
            j=++i;
        }
    }
    result.push(arr[i]);
}
console.log(result);//[ 8, 1, 7, 6, 0 ]

5、利用Array类型from()函数

arr=[2,3,4,5,4,4,6,8,5,6];;
console.log(Array.from(new Set(arr)));//[ 2, 3, 4, 5, 6, 8 ]

6、利用数据结构Map

arr=[2,3,4,5,4,4,6,8,5,6];
//定义一个map
 var map=new Map();
 var result=arr.filter(function(item){
    //添加item到map 
    if(!map.has(item)){
        map.set(item,1)
        return map;
    }
});
 console.log(result);//[ 2, 3, 4, 5, 6, 8 ]

三、找出数组中出现次数最多的元素

1、利用key-value键值对,因为是先统计次数再比较的,所以在有相同次数时优先输出前面的元素

var arr=[1,4,5,6,7,3,4,1,5,6];
var result={};
//存储出现次数最多的元素和该元素的个数
var maxElement='',maxCount=0;
//数组为空时直接返回
if(!arr.length){
    return;
}
//元素出现次数统计
for(var i=0;i<arr.length;i++){
    if(!result[arr[i]]){
        result[arr[i]]=1;
    }
    else{
        result[arr[i]]++;
    }
}
//找出出现次数最多的元素,如果有相同的则输出优先遍历到的
for(var i=0;i<arr.length;i++){
    if(result[arr[i]]>maxCount){
        maxCount=result[arr[i]];
        maxElement=arr[i];
    }
}
console.log("出现次数最多的元素是"+maxElement+",出现次数是"+maxCount)//元素是1,次数是2

优化如下:因为是边统计次数边比较,最先统计出来的是4出现了2次,所以优先输出4

var arr=[1,4,5,6,7,3,4,1,5,6];
var result={};
var maxElement='',maxCount=0;
if(!arr.length){
    return;
}
for(var i=0;i<arr.length;i++){
    //console.log(result[arr[i]]);
     result[arr[i]]===undefined?result[arr[i]]=1:result[arr[i]]++;
     if(result[arr[i]]>maxCount){
        maxCount=result[arr[i]];
        maxElement=arr[i];
    }
}
console.log("出现次数最多的元素是"+maxElement+",出现次数是"+maxCount)//元素是4,次数是2

2、利用reduce()函数

var arr=[1,4,5,6,7,3,4,1,5,6];
var maxElement='',maxCount=0;
if(!arr.length){
    return;
}
 var obj=arr.reduce(function(p,k){
    p[k]==undefined?p[k]=1:p[k]++;
    if(p[k]>maxCount){
        maxCount++;
        maxElement=k;
    }
    return p;

 },{})
 console.log("出现次数最多的元素是"+maxElement+",出现次数是"+maxCount);

小趴菜努力中,未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值