温故而知新-Javascript数组

数组,大概是我们日常操作最多的数据类型之一了吧,或者说没有之一,哈哈。无论你用什么框架,都避免不了的。本文就从熟悉数组的基本操作开始,最后对一下常见的问题进行解析。

数组的方法、属性及实例方法

如下图所示。

检测数组

1、instanceof

1
2
var arr = [];
console.log(arr instanceof Array);

问题:如果网页包含多个框架,那就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。子页面和父页面Array原生对象引用的地址不同。

2、Array.isArray

1
2
var arr = [];
console.log(Array.isArray(arr));

3、

1
2
3
function isArray(arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
}

有关数组的问题

多维数组合并成一维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//两个一维数组
var a = [0,1];
var b = [2,3];
console.log(a.concat(b));
//对于二维数组以
function flatten(arr){
var res = [], i = 0, length = arr.length;
for(;i < length; i++){
res = res.concat(arr[i])
}
return res;
}
//对于多维数组
//Array.prototype.push()方法
function flatten(arr, result) {
if (!result) {
result = []
}
for (var i = 0; i < arr.length; i++) {
if(arr[i].constructor == Array) {
flatten(arr[i], result)
} else {
result.push(arr[i])
}
}
return result
}
flatten([[1, 2], [3, 4, 5], [6, 7, 8, 9], [11,12,[12,13,[14]]], 10, 11])


function flatten(arr) {
arr = [].concat.apply([], arr)
return arr.some(Array.isArray) ? flatten(arr) : arr;
}

var arr = [1,2,4,[4,5],[4,[23,34],5]]
console.log(flatten(arr));

// 补充一个

function flatten(arr) {
return eval(`[${arr + ""}]`);
}
var arr = [1,2,4,[4,5],[4,[23,34],5]]
console.log(flatten(arr));

数组去重

ES6最快捷的:

1
2
var arr = [1,2,3,4,4,3,2,1];
[...new Set(arr)]

通过indexOf判断

1
2
3
4
5
6
7
8
9
10
11
12
var arr = [1,2,3,4,4,3,2,1];
function unique(arr){
var res = [], i = 0, len = arr.length;
for(; i < len; i++){
/*if(res.indexOf(arr[i]) == -1){
res.push(arr[i])
}*/
res.indexOf(arr[i]) == -1&&res.push(arr[i]);
}
return res;
}
unique(arr);

高效去重

1
2
3
4
5
6
7
8
9
10
11
12
var arr = [1,2,3,4,4,3,2,1];
function unique(arr){
var res = [], i = 0, len = arr.length, hash={};
for(; i < len; i++){
if(!hash[arr[i]]){
res.push(arr[i]);
hash[arr[i]] = true;
}
}
return res;
}
unique(arr);

生成指定范围指定个数的不重复随机数

例如生成 1-100范围之内的10个不重复随机数

1
2
3
4
5
6
7
8
9
10
11
var arr = [];
for (var i = 1; i <=100; i++) {
arr.push(i);
}
arr.sort(
function () {
return 0.5 - Math.random();
}
);
arr.length = 10;
console.log(arr);

不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标

方法一:

1
2
3
Array(100).fill(0).map((item, index) => {
return index
})

方法二:

1
Array.from(Array(100).keys())

方法三:

1
[...Array(100).keys()]

方法四:

1
Object.keys(Array(100).join().split(','))

方法五:

1
2
3
4
5
6
7
Array.prototype.createSpecial = function(length){
if(this.length == length){
return this;
}
this.push(this.length)
this.createSpecial(length)
}

二维数组排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function sortArr(arr) {
var goNext = true;
var entries = arr.entries();
while (goNext) {
var result = entries.next();
if (result.done !== true) {
result.value[1].sort((a, b) => a - b);
goNext = true;
}
else {
goNext = false;
}
}
return arr;
}