1.数组的遍历
1.1for..of
循环
for(const item of items)
循环遍历数组项,如下所示遍历colors
列表:
eg:
const colors = ['blue', 'green', 'white'];
for (const color of colors) {
console.log(color);
}
// 'blue'
// 'green'
// 'white'
//提示:
//咱们可以随时使用break语句停止遍历。
1.2 for
循环
for(let i; i < array.length; i++)
循环使用递增的索引变量遍历数组项。
for
通常需要在每个循环中递增index
变量
eg:
const colors = ['blue', 'green', 'white'];
for (let index = 0; index < colors.length; index++) {
const color = colors[index];
console.log(color);
}
// 'blue'
// 'green'
// 'white'
index
变量从0
递增到colors.length-1
。此变量用于按以下索引访问项:colors [index]
。
提示
咱们可以随时使用break
语句停止遍历。
1.3 array.forEach()
方法'
array.forEach(callback)
方法通过在每个数组项上调用callback
函数来遍历数组项。
在每次遍历中,都使用以下参数调用callback(item [, index [, array]])
:当前遍历项,当前遍历索引和数组本身。
eg:
const colorss = ['blue', 'green', 'white','red'];
colorss.forEach(function callback(value, index) {
console.log(value, index);
});
//blue 0 green 1 white 2 red 3
//提示:
//不能中断array.forEach()
迭代。
2.数组的映射
2.1 Array.map()
方法
array.map(callback)
方法通过在每个数组项上使用callback
调用结果来创建一个新数组。
在每个遍历中的callback(item[, index[, array]])
使用参数调用:当前项、索引和数组本身,并应该返回新项。
如下所示咱们对每个数组元素都递增 1
:
eg:
const numbers = [0,2,4,6,8,10];
const newNumbers = numbers.map(function increment(number) {
return number + 1;
});
console.log(newNumbers); // => [1, 3, 5, 7, 9, 11]
提示:
array.map()
创建一个新的映射数组,而不改变原始数组。
2.2 Array.from()
方法
Array.from(arrayLike[, callback])
方法通过在每个数组项上使用callback
调用结果来创建一个新数组。
在每个遍历中callback(item[, index[, array]])
使用参数调用:当前项、索引和数组本身并且应该返回新项。
如下所示咱们对每个数组元素都递增 1
:
eg:
const numberst = [0, 2, 4,6,8,10,12];
const newNumberst = Array.from(numberst,
function increment(number) {
return number + 1;
}
);
console.log(newNumberst); // => [1, 3, 5, 7, 9, 11, 13]
提示:
Array.from()
创建一个新的映射数组,而不改变原始数组。
Array.from()
更适合从类似数组的对象进行映射。
3. 数据的简化
3.1 Array.reduce()
方法
array.reduce(callback[, initialValue])
通过调用callback
函数来将数组简化为一个值。
在每次遍历中的callback(accumulator, item[, index[, array]])
使用用参数调用的:累加器,当前项,索引和数组本身且应该返回累加器。
经典示例是对数字数组求和:
eg:
const numbersd = [2,0,4,5];
function summarize(accumulator, number) {
return accumulator + number;
}
const sum = numbersd.reduce(summarize, 0);
console.log(sum); // => 11
第一步,将accumulator
初始化为0
。然后,对每个累加数字和的数组项调用summary
函数。
提示:
如果没有使用 initialValue 来设置初始值,则默认使用数组的第一个元素作为初始值。
4. 数据的连接
4.1 array.concat()
方法
array.concat(array1[, array2, ...])
将一个或多个数组连接到原始数组。如下所示,连接两个数组:
eg:
const heroes = ['Batman', 'Robin'];
const villains = ['Joker', 'Bane'];
const arrs = [1, 10];
const everyone = heroes.concat(villains,arrs);
console.log(everyone); // => ["Batman", "Robin", "Joker", "Bane", 1, 10]
提示:
concat()
创建一个新的数组,而不改变原来的数组
array.concat(array1 [,array2,...])
接受多个要连接的数组。
4.2 展开操作符号
咱们将展开操作符与数组字面量一起使用来连接数组:[...array1, ...array2]
。
eg:
const heroess = ['Batman', 'Catwoman',0];
const villainss = ['Joker', 'Bane',true];
const names = [...heroess, ...villainss];
console.log(names); // => ["Batman", "Catwoman", 0, "Joker", "Bane", true]
提示:
[...arr1, ...arr2, ...arrN]
:咱们可以使用展开运算符连接所需数量的数组。
5.获取数组的片段
5.1 array.slice()
方法
array.slice([fromIndex [,toIndex]])
返回数组的一个片段,该片段从fromIndex
开始,以toIndex
结尾(不包括toIndex
本身)。fromIndex
可选参数默认为0
,toIndex
可选参数默认为array.length
。
eg:
const namesw = ['Batman', 'Catwoman', 'Joker', 'Bane','xiaoming','xiaohuahua'];
const heroesw = namesw.slice(0, 2);
const villainsw = namesw.slice(2);
console.log(heroesw); // => ["Batman", "Catwoman"]
console.log(villainsw); // => ["Joker", "Bane", "xiaoming", "xiaohuahua"]
提示:
array.slice()
创建一个新数组,而不改变原始数组。
6. 数组的拷贝
6.1 展开操作符
拷贝数组的一种简单方法是使用展开运算符:const clone = [... array]
,如下所示,拷贝 colors
数组:
eg:
const colors = ['white', 'black', 'gray','red','green'];
const clone = [...colors];
console.log(clone); // => ["white", "black", "gray", "red", "green"]
console.log(colors === clone); // => false
提示:
[...array]
创建一个浅拷贝。
6.2 array.concat()
方法
[].concat(array)
是另一种拷贝数组的方法。
eg:
const colorss = ['white', 'black', 'gray',true,false,1000];
const clones = [].concat(colorss);
console.log(clones); // => ["white", "black", "gray", true, false, 1000]
console.log(colorss === clones); // => false
提示:
[].concat(array)
创建一个浅拷贝。
6.3 array.slice()
方法
array.slice())
是另一种拷贝数组的方法。
const colorsa = [true,666,false,'white', 'black', 'gray'];
const clonea = colorsa.slice();
console.log(clonea); // => [true, 666, false, "white", "black", "gray"]
console.log(colorsa === clonea); // => false
7. 查找数组
7.1 array.includes()
方法
array.includes(itemToSearch [,fromIndex])
返回一个布尔值,array
是否包含itemToSearch
。可选参数fromIndex
,默认为0
,表示开始搜索的索引。如下所示:判断2
和99
是否存在于一组数字中:
eg:
const numbers = [1, 2, 3, 4, 5];
console.log(numbers.includes(2)); // => true
console.log(numbers.includes(5)); // => true
console.log(numbers.includes(100)); // => false
7.2 array.find()
方法
array.find(predicate)
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined
。
如下所示,找到数组中的第一个偶数:
eg:
const numbersi = [1,1, 3, 4, 5];
function isEven(number) {
return number % 2 === 0;
}
const evenNumber = numbersi.find(isEven);
console.log(evenNumber); // => 4
7.3 array.indexOf()
方法
array.indexOf(itemToSearch[, fromIndex])
返回array
中第一个出现的itemToSearch
的索引。默认为0的
可选参数fromIndex
表示开始搜索的索引。
如下所示,找到Catwoman
的索引:
eg:
const names = ['Batman', 'Catwoman', 'Joker', 'Bane','javascript:;','vuejs'];
const index = names.indexOf('vuejs');
console.log(index); // => 5
提示:
如果找不到该项,则array.indexOf(itemToSearch)
返回-1
array.findIndex(predicate)
是使用predicate
函数查找索引的替代方法。
8. 查询数组
8.1 array.every()
方法
如果每个项都通过predicate
检查,则array.every(predicate)
返回true
。
在每个遍历predicate(item[, index[, array]])
上,用参数调用predicate
函数:当前遍历项、索引和数组本身。
如下所示,确定数组是否只包含偶数:
eg:
const evens = [0, 2, 4, 6,7];
const numbersw = [0, 10, 4, 6,8,10];
function isEven(number) {
return number % 2 === 0;
}
console.log(evens.every(isEven)); // => false
console.log(numbersw.every(isEven)); // => true
8.2 array.some()
方法
如果每个项只要一下通过predicate
检查,则array.every(predicate)
返回true
。
在每个遍历predicate(item[, index[, array]])
上,用参数调用predicate
函数:当前遍历项、索引和数组本身。
如下所示:确定数组是否至少包含一个偶数:
eg:
const numbersu = [1, 5, 7, 10];
const odds = [1, 3, 3, 3];
function isEven(number) {
return number % 2 === 0;
}
console.log(numbersu.some(isEven)); // => true
console.log(odds.some(isEven)); // => false
9. 数组的过滤
array.filter(predicate)
方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
在每个遍历predicate(item[, index[, array]])
上,用参数调用predicate
函数:当前遍历项、索引和数组本身。
如下所示:将一个数组过滤为仅包含偶数:
eg:
const numbersg = [1, 5, 7, 10,100,200];
function isEvensss(number) {
return number % 2 === 0;
}
const evensss = numbersg.filter(isEvensss);
console.log(evensss); // => [10, 100, 200]
提示:
array.filter()
创建一个新数组,而不改变原始数组。
10. 数组的插入
10.1 array.push()
方法
array.push(item1 [...,itemN])
方法将一个或多个项追加到数组的末尾,并返回新的长度。
如下所示,在names
数组的末尾添加 'Joker'
eg;
const names = ['Batman','xiaoming','xiaohua'];
names.push('Jok');
console.log(names); // ["Batman", "xiaoming", "xiaohua", "Jok"]
提示:
array.push()
会改变原数组
array.push(item1, item2, ..., itemN)
可以添加多个元素。
10.2 array.unshift()
方法
array.unshift(item1[..., itemN])
方法将一个或多个项追加到数组的开头,返回数组的新长度
eg:
const namess = ['man'];
namess.unshift('xiaomimi');
console.log(namess); // ["xiaomimi", "man"]
提示:
array.unshift()
会改变原数组
array.unshift(item1, item2, ..., itemN)
可以添加多个元素。
10.3 展开操作符
可以通过组合展开操作符和数组字面量以不可变的方式在数组中插入项。
在数组末尾追加一个项:
eg:
const namesh = ['Joker', 'Bane'];
const names2 = [
...namesh,
'Batman',
];
console.log(names2); // => ['Joker', 'Bane', 'Batman'];
在数组的开头追加一个项:
eg:
const namesy = ['Joker', 'Bane'];
const names22 = [
'Batmanssss',
...namesy
];
console.log(names22); // => ["Batmanssss", "Joker", "Bane"]
在任何索引处插入元素:
eg:
const namesj = ['Jokert', 'Banenes'];
const indexToInsert = 1;
const names2f = [
...namesj.slice(0, indexToInsert),
'Batman',"faleman",
...namesj.slice(indexToInsert)
];
console.log(names2f); // => ["Jokert", "Batman", "faleman", "Banenes"]
11. 删除数组元素
11.1 array.pop()
方法
array.pop()
方法从数组中删除最后一个元素,然后返回该元素。如下所示,删除colors
数组的最后一个元素:
eg:
const colors = ['blue', 'green', 'black','red'];
const lastColor = colors.pop();
console.log(lastColor); // => red
console.log(colors); // => ["blue", "green", "black"]
提示:
array.pop()
会改变原数组
11.2 array.shift()
方法
array.shift()
方法从数组中删除第一个元素,然后返回该元素。
eg:
const colorss = ['blue', 'green', 'black','red','pink'];
const firstColor = colorss.shift();
console.log(firstColor); // => 'blue'
console.log(colorss); // => ["green", "black", "red", "pink"]
提示:
array.shift()
会改变原数组。
array.shift()
具有O(n)
复杂度。
11.3 array.splice()
方法
array.splice(fromIndex[, removeCount[, item1[, item2[, ...]]]])
从数组中删除元素,并插入新的元素。
例如,咱们从索引1
处删除2
个元素:
eg:
const namesa = ['张三', '李四', '王五', '赵六','小花']
namesa.splice(1, 2)
console.log(namesa) // => ["张三", "赵六", "小花"]
names.splice(1,2)
删除元素'张三'
和'赵六'
。
names.splice()
可以插入新元素,而不是插入已删除的元素。咱们可以替换索引1
处开始的的2
个元素,然后插入一个新的元素 '小花'
:
eg:
const namesg = ['张三', '李四', '王五', '赵六']
namesg.splice(1, 2, '小花')
console.log(namesg) // ["张三", "小花", "赵六"]
提示:
array.splice()
会改变原数组。
11.4 展开操作符号
可以通过组合展开操作符和数据字面量以不可变的方式从数组中删除项。
eg:
const namest = ['张三', '李四', '王五', '赵六','小花','小明','小米'];
const fromIndex = 1
const removeCount = 2
const newNames = [
...namest.slice(0, fromIndex),
...namest.slice(fromIndex + removeCount)
]
console.log(newNames) // ["张三", "赵六", "小花", "小明", "小米"]
12. 清空数组
12.1 array.length
属性
array.length
是保存数组长度的属性。除此之外,array.length
是可写的。
如果咱们写一个小于当前长度的array.length = newLength
,多余的元素从数组中移除。
如下所示:使用array.length = 0
删除数组中的所有项目:
eg:
const colors = ['blue', 'green', 'black'];
colors.length = 0;
console.log(colors); // []
12.2 array.splice()
方法
array.splice(fromIndex[, removeCount[, item1[, item2[, ...]]]])
从数组中删除元素,并插入新的元素。
如果removeCount
参数被省略,那么array.splice()
将删除从fromIndex
开始的数组的所有元素。咱们使用它来删除数组中的所有元素:
eg:
const colorss = ['blue', 'green', 'black'];
colorss.splice(0);
console.log(colorss); // []
13. 填充数组
13.1 array.fill()
方法
array.fill(value[, fromIndex[, toIndex]])
用从fromIndex
到toIndex
的值填充数组(不包括toIndex
本身)。fromIndex
可选参数默认为0
,toIndex
可选参数默认为array.length
。
例如,使用用零值填充数组:
eg:
const numbers = [1, 2, 3, 4,10];
numbers.fill(0);
console.log(numbers); // => [0, 0, 0, 0, 0]
不仅如此,还可以使用Array(length).fill(initial)
来初始化特定长度和初始值的数组。
eg:
const length = 10;
const zeros = Array(length).fill(0);
console.log(zeros); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
提示:
array.splice()
会改变原数组。
13.2 Array.from()
函数
Array.from()
有助于初始化带有对象的特定长度的数组:
eg:
const lengths = 6;
const emptyObjects = Array.from(Array(lengths), function() {
return {"a": 100};
});
console.log(emptyObjects); //[{"a": 100},{"a": 100}, {"a": 100},{"a": 100}, {"a": 100}, {"a": 100}]
14. 数组的扁平化
14.1 array.flat()
方法
array.flat([depth])
方法通过递归扁平属于数组的项直到一定深度来创建新数组。 depth
可选参数默认为1
:
const arrays = [0, [1, 3, 5],
[2, 4, [10,20]]
];
const flatArray = arrays.flat(2);
console.log(flatArray); // [0, 1, 3, 5, 2, 4, 10, 20]
arrays
包含数字和数字数组的混合。 arrays.flat()
对数组进行扁平,使其仅包含数字。
提示:
array.flat()
创建一个新数组,而不会改变原始数组。
15. 数组的排序
15.1 array.sort()
方法
array.sort([compare])
方法对数组的元素进行排序。
可选参数compare(a, b)
是一个自定义排序顺的回调函数。如果比较compare(a, b)
返回的结果:
如果 a
小于b
,在排序后的数组中a
应该出现在b
之前,就返回一个小于0
的值。
如果a
等于b
,就返回0
。
如果a
大于b
,就返回一个大于0
的值。
如下所示,对数组 numbers
时行排序
eg:
const numbersa = [4, 3, 1, 2];
numbersa.sort();
console.log(numbersa); // => [1, 2, 3, 4]
numbers.sort()
以升序对数字进行排序。
使用比较函数,让偶数排在奇数前面:
eg:
const numbersh = [100,4, 3, 1, 2,10,20];
function compare(n1, n2) {
if (n1 % 2 === 0 && n2 % 2 !== 0) {
return -1;
}
if (n1 % 2 !== 0 && n2 % 2 === 0) {
return 1;
}
return 0;
}
numbersh.sort(compare);
console.log(numbersh); // => [100, 4, 2, 10, 20, 3, 1]