0. 简介
- 什么是数组
- 使用场景
- 简单使用实例
1. 创建
2. 常用函数
3. 方法
new Array
var ar1 = new Array();
var ar2 = new Array(7); //区别,都是空数组,length属性不同
userNames = [];
//注意:引用类型
var newArr = oldArr.map();
var newArr = oldArr.slice();
var newArr = oldArr.concat();
var newArr = Array.from();
a.includes代替a.indexOf()
- includes, return Boolean
- indexOf() , return Number,-1, 0, 1, 2
‘abcf’.includes(‘a’)// true
‘abcf’.includes(‘e’)// false
‘abcf’.indexOf(‘a’)// 0
‘abcf’.indexOf(‘e’)// -1
改变数组方法
- push, 尾部添加, 仅支持一个元素
- pop, 尾部移除, 支持固定位置
- unshift, 头部添加
- shift, 头部移除
- concat, 拼接
js, 简单使用
var arr = [1,2]
arr.push(3); // 3
arr // (3) [1, 2, 3]
arr.pop() // 3
arr // (2) [1, 2]
arr.unshift(3) // 3
arr // (3) [3, 1, 2]
arr.shift() // 3
arr // (2) [1, 2]
arr.concat([3,4]) // (4) [1, 2, 3, 4]
arr.concat([2,3,4]) // (5) [1, 2, 2, 3, 4]
注意:
- arr.push(newArr) // bad
js复杂使用
arr = [1, 2, 2, 3, 4]
arr.pop(2) // 2
arr // [1]
a.reverse()
return Array
[1, 2, 3, 4].reverse(); // (4) [4, 3, 2, 1]
array.concat() 拼接
array1.concat(array2,array3,...,arrayN);
var a = [1,2];
var b = a.slice();
copyArr = arr.concat();
splice与slice区别
- 传参同分
- 功能有差异
- 返回值不同
- 原数组不同
Array.splice(index, remove, add1, …, addn) 添加删除
返回添加和删除的数组,原数组发生改变
var arr = [1, 2, 3, 4, 5, 6, 7, 8];
arr.splice(2,3); // [3, 4, 5]
arr; // (5) [1, 2, 6, 7, 8]
arr.splice(0,0,'9',9) // []
arr // ["9", 9, 1, 2, 6, 7, 8]
Array.slice(start[, end = last]) 删除
返回删除后的数组, 原数组不变
var a = [1, 2, 3, 4];
a.slice(1) //[2, 3, 4]
a // [1, 2, 3, 4]
a.slice(1,3); //[2, 3]
格式化为数组split(reg,)
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
'ab d'.split("")
//(4) ["a", "b", " ", "d"]
'haha武,空 闲[时]间'.split("")
//(13) ["h", "a", "h", "a", "武", ",", "空", " ", "闲", "[", "时", "]", "间"]
sort 排序(慎用)
修改原数组并返回。原理是先转成string后使用ASCII升序排列。
注意, 数字类型数组升/降序,错误写法 sort((a, b) => a > b)
[10, 20, 1, 2].sort((a, b) => a - b); // (4) [1, 2, 10, 20]
[10, 20, 1, 2].sort((a, b) => b - a); // (4) [20, 10, 2, 1]
array.fill()
var arr = new Array(5);
arr.fill(5); //arr = [5,5,5,5,5]
arr[3] = 3; //arr = [5,5,5,3,5]
Array.map用法
========================特殊用法
['1', '7', '11'].map(parseInt)
// (3) [1, NaN, 3]
=======================等价
parseInt('1', 0) // 1
parseInt('7', 1) // NaN
parseInt('11', 2) // 3
['1', '7', '11'].map(
(val, index, array) => parseInt(val, index, array)
);
// 其中parseInt, 解析一个字符串,并返回一个整数。radix = [2, 36]
function parseInt (string[, radix]) {
}
['1', '7', '11'].map(console.log)
// VM156708:1 1 0 (3) ["1", "7", "11"]
// VM156708:1 7 1 (3) ["1", "7", "11"]
// VM156708:1 11 2 (3) ["1", "7", "11"]
// (3) [undefined, undefined, undefined]
// 上面的例子相当于
[1, 2, 3, 4, 5].map(
(val, index, array) => console.log(val, index, array)
);
.forEach()
var a = [1,2,3];
a // (3) [1, 2, 3]
a.forEach((d) => d+1);
a // (3) [1, 2, 3]
var b = a.forEach((d) => d+1);
b // undefined
var b = a.map((d) => d+1);
b // (3) [2, 3, 4]
forEach、map、reduce区别:
forEach遍历进行操作、map返回新数组、reduce进行累计操作
array.map()
var arrmap = arr.map(x => x); //arrmap = [5,5,5,3,5]
for-in、for-of
for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。
var aa = ['s', 'd', 'e'];
undefined
for(var k in aa) {
console.log(v);
}
<!--VM687:2 0-->
<!--VM687:2 1-->
<!--VM687:2 2-->
undefined
for(var v of aa) {
console.log(v);
}
<!--VM697:2 s-->
<!--VM697:2 d-->
<!--VM697:2 e-->
.find 替代filter过滤, .some 替代.finds
all return a new array
.finde return first
.filter, return all
var aa = [3,1,2,5,3,5];
aa.filter(v => v > 2)// (4) [3, 5, 3, 5]
aa.find(v => v > 2)// 3, 返回整个value
aa.some(v => v > 2)// true
aa.every(v => v > 2)// false
some、every
return Boolean
array.reduce() 代替 map、代替filter
// a, 累加器,c, 当前值
reduce
param0: Function
param1: p初始值
var arr = [5, 4, 3, 2, 1 ];
arr.reduce((a) => console.log(a)) // exception
[3, 4, 3, 1, 9, 5].reduce((p,c) => {
//console.log(p, c);
return p+c;
}, 0);
// 0, 3==3, 4===7, 3====10, 1====11, 9====20, 5====25
// 25
[3, 4, 3, 1, 9, 5].reduce((p,c) => {
return p.concat({value: c});
}, []);
// [{value: 3}, {value: 4}, {value: 3}, {value: 1}, {value: 9}, {value: 5}]
array.from()
const arrfromstr = Array.from('hello'); //arrfromstr = ["h", "e", "l", "l", "o"]
const arrfromlength = Array.from({length: 4}); //arrfromlength = [undefined, undefined, undefined, undefined]
const arrfromarr = Array.from({length: 4}, (v, i) => i); //arrfromarr = [0, 1, 2, 3]
//参数,无参数(), 第一个参数表示遍历元素(x,v作用相同),第二个参数表示index
//x一般表示已有单元,v表示,i表示序号
Array.from([1, 2, 3], x => x + x);
// [2, 4, 6]
## 错误修正
Array.from({length: 4}, x => x);
(4) [undefined, undefined, undefined, undefined]
Array.from({length: 4}, i => i);
(4) [undefined, undefined, undefined, undefined]
Array.from({length: 4}, (v, i) => i);
(4) [0, 1, 2, 3]
Array.filter
过滤出奇数
var a = [1,2,3,4,5];
a.filter(v => v%2);
浅拷贝
自定义扩展—移除指定项
Array.prototype.remove = (val) => {
const tmpIndex = this.indexOf(val);
if (tmpIndex > -1) {
this.splice(tmpIndex, 1);
}
}
push()和concat()的区别
- push, 从尾部扩展数组, 返回第一个参数。修改原数组。
- concat, 返回拼接后的数组, 支持多个参数, 数组会被解析。不修改原数组。
// push
var a1 = [1];
a1.push(2) // 2
a1 // [1, 2]
多个参数
a1.push(3, 4) // 3
a1 // [1, 2, 3, 4]
// 若果参数是[]
a1 // [1, 2, 3, 4, []]
// concat
var a2 = [1];
a2.concat(2,3) // [1, 2, 3]
a2 // [1]
a2.concat(2, [5, 6]) // [1, 2, 5, 6]
a2 // [1]
// push/concat, 扩展数组到一个数组
var a3 = [1]
a3 = a3.concat([2, 3]) // [1, 2, 3]
a3 // [1, 2, 3]
var a3 = [1]
a3.push.apply(a3, [2, 3]) // 3
a3 // [1, 2, 3]
flat()+flatMap()
- flat,深度递归遍历数组, return new Array
- flatMap, 映射函数映射每个元素
flat
/**
* @description - 会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
* @param depth - 指定要提取嵌套数组的结构深度, 默认值为 1。
* @return { array } - 一个包含将数组与子数组中所有元素的新数组。
*/
arr.flat(depth);
================================================================
var arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
//使用 Infinity 作为深度,展开任意深度的嵌套数组
arr3.flat(Infinity);
// [1, 2, 3, 4, 5, 6]
// 会移除数组中的空项
var arr4 = [1, 2, , 4, 5];
arr4.flat();
// [1, 2, 4, 5]
flatMap
/**
* @description - 使用映射函数映射每个元素,然后将结果压缩成一个新数组。
* @param callback - 可以生成一个新数组中的元素的函数,可以传入三个参数:
* @param currentValue - 当前正在数组中处理的元素。
* @param index - 可选的。数组中正在处理的当前元素的索引。
* @param array - 可选的。被调用的 map 数组。
* @param thisArg - 可选的。执行 callback 函数时 使用的this 值。
* @return { array } - 一个新的数组,其中每个元素都是回调函数的结果,并且结构深度 depth 值为1。
*/
arr.flatMap(function callback(currentValue[, index[, array]]) {
// 返回新数组的元素
}[, thisArg])
======================================================================
let arr = ["今天天气不错", "", "早上好"];
arr.map(s => s.split(""));
// [["今", "天", "天", "气", "不", "错"],[""],["早", "上", "好"]]
arr.flatMap(s => s.split(""));
// ["今", "天", "天", "气", "不", "错", "", "早", "上", "好"]
自定义—去重
参考, .uniq(array), .uniqBy(array)
Array.prototype.unique = function () {
var newArr = [];
for (var i = 0; i < this.length; i++) {
if (newArr.indexOf(this[i]) == -1) {
newArr.push(this[i]);
}
}
return newArr;
}
var arr = ['a','b',1,4,5,8,4,3,1,'a','1'];
console.log(arr.unique()); // (8) ["a", "b", 1, 4, 5, 8, 3, "1"]
二维数组
let buckets = new Array(bucketCount).fill([]);
错误写法
// 快速定义
// matrix
var arr = [1,2];
var ma = Array.from({length: 1}, () => arr);
undefined
格式化为二维数组
判断数组纬度data[0] instanceof Array
if(!(this.data[0] instanceof Array)){
let tempArr = [];
tempArr.push(this.data);
this.data = tempArr;
}
const d = [92, 71, 0, 25, 36, 100];
d3.max(d); //100
const arr= [[92, 71, 0, 25, 36, 100],[34, 67, 67, 5, 96, 10]];
var max_arr = [];
arr.forEach(d => console.log(d3.max(d))); //100,96
arr.forEach(d => max_arr.push(d3.max(d)));
d3.max(max_arr);
问题二维数组concat深复制
var data = [[12,23,1,2,'--',34,'--'],['--',23,'--',2,'--',34,'--']];
// var newData = Array.from({length: data.length}, v => []);
var newData = Array.from({length: data.length}, (v, i) => data[i].concat());
// console.log(newData);
newData[1][2] = 'test';
console.log(data, newData)