一、有以下 3 个判断数组的方法,分别介绍它们之间的区别和优劣
Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()
1:Object.prototype.toString.call() 常用于判断浏览器内置对象时。
封装:
function getClass (a) {
const str = Object.prototype.toString.call(a)
return /^\[object (.*)\]$/.exec(str)[1]
}
getClass(undefined) 输出'Undefined'
同理: getClass([]) 输出'Array'
2、instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
3、 Array.isArray() 用来判断对象是否为数组
二、扁平化数组的函数flatten函数的实现
let arr = [1, 2, [3, 4, 5, [6, 7], 8], 9, 10, [11, [12, 13]]]
const flatten = function (arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}
console.log(flatten(arr))
// 这里懂得isArray方法和concat方法就行
或者
const flatten = array => array.reduce(
(acc, cur) => (Array.isArray(cur) ? [...acc, ...flatten(cur)] : [...acc, cur]),
[]
)
或者
let result = [];
let fn = function(arr) {
for(let i = 0; i < arr.length; i++) {
let item = arr[i];
if (Array.isArray(arr[i])){
fn(item);
} else {
result.push(item);
}
}
}
或者
let str = JSON.stringify(ary);
arr = str.replace(/(\[|\])/g, '').split(',')
三、求数组最大值:
var max = arr.reduce(function (prev, cur) {
return Math.max(prev,cur);
});
或者
Math.max.apply(Math, dataArr)
四、求数组最大值位置:
let dataArr = [2,4,9,3]; dataArr.indexOf(Math.max.apply(Math, dataArr))
五、数组去重:
var arr2 = [];
var arr = [2, 3, 'h', 'h', 5, 5];
for (var i = 0; i < arr.length-1; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j,1);
j--;
}
}
}
console.log(arr2);
或者 (这个要在数组是纯数字的时候执行)
var result = [];
var temp = [];
var len = 0;
var num;
while (len < 10) {
num = Math.round(Math.random() * 100);
console.log(temp[num]);
if (!temp[num]) {
temp[num] = 1;
result.push(num);
len++;
}
}
console.log(result)
或者
var newArr = arr.reduce(function (prev, cur) {
prev.indexOf(cur) === -1 && prev.push(cur);
return prev;
},[]);
或者
var arr = [1,9,8,8,7,2,5,3,3,3,2,3,1,4,5,444,55,22];
function noRepeat(arr) {
//定义一个新的临时数组
var newArr=[];
//遍历当前数组
for(var i=0;i<arr.length;i++) {
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if(newArr.indexOf(arr[i]) === -1) { //indexOf() 判断数组中有没有字符串值,如果没有则返回 -1
newArr.push(arr[i]);
}
}
return newArr
}
var arr2 = noRepeat(arr);
console.log(arr2);
六、Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。
那么什么是类数组对象呢?所谓类数组对象,最基本的要求就是具有length属性的对象。
将类数组对象转换为真正数组:
let arrayLike = {
0: 'tom',
1: '65',
2: '男',
3: ['jane','john','Mary'],
'length': 4
}
let arr = Array.from(arrayLike)
console.log(arr) // ['tom','65','男',['jane','john','Mary']]
例题:
某公司 1 到 12 月份的销售额存在一个对象里面,如下:{1:222, 2:123, 5:888},
请把数据处理为如下结构:[222, 123, null, null, 888, null, null, null, null, null, null, null]
答:
var objs = {1:222, 2:123, 5:888};
var results = Array.from({ length: 12 }).map((_, index) => objs[index + 1] || null);
console.log(results)
或
var objs = {1:222, 2:123, 5:888};
Array.from({length:12},(item,index)=>objs[index+1]||null)