一、判断一个变量是数组还是对象
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);
小趴菜努力中,未完待续。。。