JavaScript Array
一、基础Api
1.concat()
方法用于合并两个或多个数组
不会改变现有数组,返回新的数组
var arr = [1, 2, 4];
var arr2 = [3, 5, 7];
var arr3 = arr.concat('10', arr2)
console.log(arr3) // [1, 2, 4, "10", 3, 5, 7]
2.slice()
返回一个从开始到结束(不包括结束下标)选择的数组
不会改变现有数组,返回新的数组
var colors = ['red','green','blue','black','white'];
var colors2 = colors.slice(1) //green,blue,black,white
var colors3 = colors.slice(1,4) //green,blue,black
3.splice()
始终会返回一个数组,包含从原始数组中删除的项,如果未更改,则返回空数组
①、删除 :需指定两个参数,要删除的第一项位置和要删除的项数
②、插入:需提供3个参数,起始位置,要删除的项数,要插入的项(多个项加,项,项,….)
③、替换:需提供3个参数,起始位置,要删除的项,要替换的项(删除项数==新增项数)
改变现有数组,返回新的数组
var colors = ['red','green','blue'];
var removed = colors.splice(0,1);
console.log(colors); //["green", "blue"]
console.log(removed); //["red"]
var removed = colors.splice(1,0,'black');
console.log(colors); //["green", "black", "blue"]
console.log(removed); // 返回空数组
var removed = colors.splice(0,2,'yellow','white');
console.log(colors); //["yellow", "white", "blue"]
console.log(removed); //["green", "black"]
4.join()
使用特定符号分割
var colors = ['red','green'];
var str = colors.join(.) // 'red.green'
5.push()
将传入值添加到数组的末尾,并返回长度
改变现有数组,返回新的数组长度
var arr = [1, 2, 4];
var key = arr.push(10)
console.log(arr) // [1, 2, 4, 10]
console.log(key) // 4
6.pop()
删除并返回原数组最后一项
改变现有数组,返回最后一项
var arr = [1, 2, 4];
var key = arr.pop()
console.log(arr) // [1, 2]
console.log(key) // 4
7.shift()
移除并返回原数组中第一项
改变现有数组,返回第一项
var arr = [1, 2, 4];
var key = arr.shift(10)
console.log(arr) // [2, 4]
console.log(key) // 1
8.unshift()
在原数组顶部添加项 并返回现数组长度
改变现有数组,返回现数组长度
var arr = [1, 2, 4];
var key = arr.unshift('xiaoming')
console.log(arr) // ["xiaoming", 1, 2, 4]
console.log(key) // 4
9.reverse()
反转原数组
var arr = [1, 2, 9, 4];
arr.reverse() // [4, 9, 2, 1]
10.toString()
将函数对象转换为字符串
var arr = [1, 2, 9, 4];
var str = arr.toString() // "1,2,9,4"
11.toLocaleString()
将函数对象转换为字符串
var person1 = {
toString: function(){
return 'pp';
},
toLocaleString:function(){
return 'oo';
}
}
var person2 = {
toString: function(){
return 'op';
},
toLocaleString:function(){
return 'po';
}
}
alert([person1,person2]); //pp,op
alert([person1,person2].toString()); //pp,op
alert([person1,person2].toLocaleString()); //oo,po
12.sort(funciton)
将函数对象转换为字符串
funciton必须为一个函数
空||a-b升序 b-a降序
var arr = [1, 2, 9, 4];
var str = arr.sort() // 1,2,4,9
function order(a,b) {
return b - a
}
arr.sort(order) //9,4,2,1
二、查找Api
13.indexOf(item, start)
返回数组中某个指定的元素位置,没找到指定元素则返回 -1
item: 必须,查找的元素;
start: 可选,取值是 0 到 stringObject.length - 1
var arr = ["Banana", "Orange", "Apple", "Mango"];
var str = arr.indexOf("Apple"); // 2
14.lastIndexOf(item, start)
原理同indexOf,起始方向相反
15/16.find/findIndex((item, index,array), thisValue) es6
找到满足条件的第一个元素/元素下标返回,未找到则返回underfined/-1
item: 必须,当前元素;
index: 当前元素索引
array: 实参数组
thisValue: 可选, 传递给函数的值一般用 “this” 值。
如果这个参数为空, “undefined” 会传递给 “this” 值
var ages = [3, 10, 18, 20];
var age = ages.find((item,index,arr) => {
return item >= 18 //18
return item >= 30 //undefined
})
var ageIdnex = ages.findIndex((item,index,arr) => {
return item >= 18 //2
return item >= 30 //-1
})
三、迭代Api (不会改变原数组)
17.every(function((item,index,array), thisValue){…})
对数组中的每一项都运行给定的函数,每一项运行正确返回true,or >false
形参同上
var arr = [1,2,3,4,5]
var bool = new Boolean
bool = arr.every(function(item,index,array){
return item > 0 // true
})
bool = arr.every(function(item,index,array){
return item < 2 // false
})
18.filter(function((item,index,array), thisValue){…})
给原数组运行特定的函数,返回 判定为true 的项组成的新的数组
形参同上
var numbers=[1,2,3,4,5,4,3,1];
var filterResult = numbers.filter(function (item, index, array) {
return (item > 2);
})
console.log(filterResult); //[3,4,5,4,3]
19.forEach(function((item,index,array), thisValue){…})
对数组中的每一项运行给定的函数。这个方法没有返回值
形参同上
var numbers=[1,2,3,4,5,4,3,1];
var sum = 0;
var forEachResult = numbers.forEach(function (item, index, array) {
array[index] == item; //true
sum += item;
})
console.log(sum) //23
20.map(function((item,index,array), thisValue){…})
对数组每一项运行给定的函数,返回执行后结果组成的数组
形参同上
var numbers=[1,2,3,4,5,4,3,1];
var mapResult = numbers.map(function (item, index, array) {
return item * 2;
})
console.log(mapResult); //[2,4,6,8,10,8,6,2]
21.some(function((item,index,array), thisValue){…})
*对数组中的每一项运行给定的函数,如果该函数对任一项返回t则返回true
形参同上
var numbers=[1,2,3,4,5,4,3,1];
var someResult = numbers.some(function (item, index, array) {
return (item > 2);
})
console.log(someResult); //true
四、汇总Api
22/23.reduce/reduceRight(function((total, item, index, array), initialValue){…})
对数组每一项运行给定的函数,返回执行后结果组成的数组
total: 必须。初始值,或计算后的返回值
initialValue: 可选。传递给函数的初始值
item、index、array 同上
var arr = [1, 2, 3, 4, 5];
var sumReduce = arr.reduce(function (prev, item, index, array) {
//prev 为截至到当前元素之前的临时汇总值
return prev + item
});
console.log(sumReduce) //15
reduceRight() 累加方向相反
五、其他Api
24.keys() es6
从数组 fruit 创建一个数组迭代对象, 该对象包含了数组的键
一个新的 Array 迭代器对象 下标
var arr = ['a', 'b', 'c'];
var arr1 = array1.keys();
for (var key of arr1) {
console.log(key); // 0 1 2
}
||
arr1.next() //{value: 0, done: false}
arr1.next() //{value: 1, done: false}
arr1.next() //{value: 2, done: false}
arr1.next() //{value: underfined, done: true}
25.entries() es6
返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)
与keys()用法相似 返回值
var a = ['a', 'b', 'c'];
var iterator = a.entries();
console.log(iterator.next().value); // [0, 'a']
console.log(iterator.next().value); // [1, 'b']
console.log(iterator.next().value); // [2, 'c’]
for of 循环
var a = ['a', 'b', 'c'];
var iterator = a.entries();
for (let e of iterator) {
console.log(e);
}
// [0, 'a']
// [1, 'b']
// [2, 'c']
26.values() es6
返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)
与keys()用法相似 返回值
var a = ['a', 'b', 'c'];
var iterator = a.values();
console.log(iterator.next()); // {value: "a", done: false}
console.log(iterator.next()); // {value: "b", done: false}
console.log(iterator.next()); // {value: "c", done: false}
for of 循环
var a = ['a', 'b', 'c'];
var iterator = a.values();
for (let e of iterator) {
console.log(e);
}
// a
// b
// c
27.copyWithin(target, start, end) es6
方法用于从数组的指定位置拷贝元素到数组的另一个指定位置中
target:必填, 复制到指定的目标索引位置
start: 复制到指定的目标索引位置(不包含所指)
target: 复制到指定的目标索引位置(不包含所指)
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]//
28.fill(value, start, end) es6
方法用于从数组的指定位置拷贝元素到数组的另一个指定位置中
target: 必填,填充值
start:可选, 填充起始位置
end: 填充结束位置 默认最后,实际end-1
var arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
arr1.fill(7)
// 7,7,7,7,7,7,7,7,7,7,7
var arr4 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
arr4.fill(7, 2)
// 1,2,7,7,7,7,7,7,7,7,7
var arr6 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
arr6.fill(7, 2, 5)
//1, 2, 7, 7, 7, 6, 7, 8, 9, 10, 11
29/30.flat(deep)/flatMap( ) es6
方法用于从数组的指定位置拷贝元素到数组的另一个指定位置中
deep: ··concat 操作次数
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]
31.flatMap( deep)
它与 map 和 深度值1的 flat 几乎相同,效率高一点
var arr1 = [1, 2, 3, 4];
arr1.map(x => [x * 2]);
// [[2], [4], [6], [8]]
arr1.flatMap(x => [x * 2]);
// [2, 4, 6, 8]
// 只会将 flatMap 中的函数返回的数组 “压平” 一层
arr1.flatMap(x => [[x * 2]]);
// [[2], [4], [6], [8]]
六、静态Api
32.Array.from()
将一个类数组对象或者可遍历对象转换成一个真正的数组
最基本的要求就是具有length属性的对象
依据实参length、相应下标返回新的数组
可进行类map操作
//字符串转数组
Array.from('abc') //['a','b','c']
//类数组转数组
//实例1
var arrLike = {
0: 'Gry',
1: '88',
3: 'Apple'
length: 3
}
var arr = Array.from(arrLike) // ["Gry", "88", "undefined"]
//实例2
var arrLike = {
0: 'Gry',
1: '88',
2: 'Apple'
}
var arr = Array.from(arrLike) // []
//实例3
var arrLike = {
name: 'Gry',
age: '88',
favoriteFood: 'Apple',
length: 3
}
var arr = Array.from(arrLike) // [undefined, undefined, undefined]
//类map操作
var arr = [1,2,3,4,5]
var fromArr = Array.from(arr, item => item * 2)
console.log(fromArr) // [2, 4, 6, 8, 10]
var likeArr = {
1: 10,
2: 20,
0: 30,
3: 40,
'length': '3'
}
var fromArr = Array.from(likeArr, item => item * 2)
console.log(fromArr) // [60, 20, 40]
33.Array.isArray(item)
用于确定传递的值是否是一个数组
item: 需判断的值
// 下面的函数调用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
Array.isArray(new Array('a', 'b', 'c', 'd'))
// Array.prototype 也是一个数组。
Array.isArray(Array.prototype);
// 下面的函数调用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray(new Uint8Array(32))
Array.isArray({ __proto__: Array.prototype });
32.Array.of()
将传入的参数转换为数组
任意个参数,将按顺序成为返回数组中的元素
Array.of(3); // [3]
Array.of(1, 4, 3) // [1, 4, 3]