数组中的迭代方法
-
forEach()
- 方法对数组的每个元素执行一次给定的函数(按升序)。
- 该方法传入一个callback函数,这个函数有三个参数:①当前元素的值 ②当前元素的下标(可选) ③ 数组本身(可选)
- 该方法不修改原数组,返回值为undefined
- 该方法适合用于遍历数组(取代for),拿到数组的每一项进行一些操作
- 在MDN中看到值得注意的一点:注意在promise或者async await中的使用,当浏览器对异步函数进行回调的时候,已经打印sum = 0了,如果每次循环都对sum进行打印的话,会发现其分别是5, 4, 5
let ratings = [5, 4, 5];
let sum = 0;
let sumFunction = async function (a, b) {
return a + b;
}
ratings.forEach(async function(rating) {
sum = await sumFunction(sum, rating);
})
console.log(sum);
// Expected output: 14
// Actual output: 0
-
map()
- 对数组进行迭代,并且返回新数组。
- 参数:callback函数,callback函数中同样有三个参数:当前元素值、当前元素下标(可选)、数组本身(可选)
- callback函数的返回值组成新数组。(原数组不变)
let arr = [10,20,30]
let mapResult = arr.map((item,index)=>{return item*2})
console.log(mapResult) -> [20, 40, 60]
-
filter()
- 创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
- 参数:callback函数,callback函数中同样有三个参数:当前元素值、当前元素下标(可选)、数组本身(可选)
- 原数组不变
let arr = [10,20,1,3,500]
let filterResult = arr.filter((item,index)=>{
return item > 10
})
consolo.log(filterResult) -> [20, 500]
-
reduce()
- 参数有两个:
- callback函数 : callback(accumulator,item,index):
- accumulator:累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方)。
- item:当前元素的值
- index(可选):当前元素的下标
- initialValue(可选):作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
- callback函数 : callback(accumulator,item,index):
- 参数有两个:
reduce api用法
let arr = [10, 20, 30, 40];
result = arr.reduce((N, item) => {
// 第一次:10 20
// 第二次:30 30
// 第三次: 60 40
// ...
// reduce只传递一个回调函数,那么N第一次默认是第一项,后续的N是上一次函数执行的处理结果
console.log(N, item);
return N + item;
});
console.log(result);
result = arr.reduce((N, item) => {
console.log(N, item);
return N + item;
}, 0); //=>REDUCE的第二个参数就是给N赋值的初始值 ITEM从数组第一项开始遍历
console.log(result);
-
some()
- 遍历数组中的每一项
- 参数:回调函数 回调函数有两个参数(item,index) item是数组中当前要操作 的这一项,index是当前项的索引
- 返回值:指定函数判断后 有一个为true 则返回true
- 不改变原数组
const array = [1, 2, 3, 4, 5];
// checks whether an element is even
const even = (element) => element % 2 === 0;
console.log(array.some(even));
// expected output: true
-
every()
- 与some类似,不同的是,every要求每一项都符合函数判断才能返回true
数组的排序或者排列
-
reverse()
- 把数组倒过来排列
- 返回值:排列后的新数组
- 原来数组改变
let ary = [12, 15, 9, 28, 10, 22];
ary.reverse(); console.log(ary); //=>[22, 10, 28, 9, 15, 12]
-
sort(compareFunction)
- 对数组进行排序
- 参数:可以没有,也可以是个函数
- 返回值:排序后的新数组
- 原来数组改变
- SORT方法中如果不传递参数,是无法处理10以上 数字排序的(它默认按照每一项第一个字符来排)
ary = [12, 15, 9, 28, 10, 22];
ary.sort();
console.log(ary); //=> [10, 12, 15, 22, 28, 9]
- 想要实现多位数正常排序,需要给SORT传递一个函 数,函数中返回 a-b 实现升序,返回 b-a 实现降
- MDN中还有许多细节,在这不一一赘述
ary = [12, 15, 9, 28, 10, 22];
ary.sort(function(a,b){ return a-b; });
//ary.sort((a, b) => a - b);
console.log(ary); => [9, 10, 12, 15, 22, 28]
把数组转换为字符串
-
toString()
- 返回值:转换后的字符串,每一项用逗号分隔(原来数组不变)
let ary = [10, 20, 30];
let res = ary.toString();
console.log(res); //=>"10,20,30"
console.log([].toString()); //=>""
console.log([12].toString()); //=>"12"
-
join()
- 把数组转换为字符串 参数为指定的分隔符(字符串格式) 返回值是转换后的字符串(原来数组不变)
let ary = [10, 20, 30];
let res = ary.join('');
console.log(res); //=>"102030"
res = ary.join();
console.log(res); //=>"10,20,30"
res = ary.join('|');
console.log(res); //=>"10|20|30"
res = ary.join('+');
console.log(res); //=>"10+20+30"
console.log(eval(res)); //=>60 eval把字 符串变为JS表达式执行
检测数组中的含某一项
-
indexOf()
- 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
- 参数:第一个为要查找的给定元素 ,第二个是从数组中的哪个位置开始查找(可选)
- lastIndexOf()则是找到给定元素最后出现的索引
let ary = [10, 20, 30, 10, 20, 30];
console.log(ary.indexOf(20)); //=>1
console.log(ary.lastIndexOf(20)); //=>4
-
includes()
- 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
数组中的增删改查
-
push()
- 向数组末尾增加内容,参数可以是任意类型
- 返回值是新增后数组的长度
let ary = [10, 20];
let res = ary.push(30, 'AA');
ary[ary.length] = 40; // 基于原生JS操作键值对的方法,也可以向末尾追加 一项新的内容
console.log(res, ary); //=>4 [10,20,30,'AA',40]
-
pop()
- 删除数组中的最后一项
- 返回值是删除的那一项
let ary = [10, 20, 30, 40];
let res = ary.pop();
console.log(res, ary); //=>40 [10,20,30]
-
shift()
- 删除数组第一项
- 返回值是删除的那一项
let ary = [10, 20, 30, 40];
let res = ary.shift();
console.log(res, ary); //=>10 [20, 30, 40]
-
unshift()
- 向数组开始位置增加内容,参数多个可以是多个,任意类型
- 返回值是新增后数组长度
let ary = [10, 20];
let res = ary.unshift(30, 'AA');
console.log(res, ary); //=>4 [30,'AA',10,20]
slice与splice
-
arr.slice(begin, end) ->数组浅拷贝
-
方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
- begin(可选)
如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
如果省略 begin,则 slice 从索引 0 开始。
如果begin 超出原数组的索引范围,则会返回空数组。 - end (可选)
如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
如果 end 被省略,则 slice 会一直提取到原数组末尾。
如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。
- begin(可选)
-
方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
let ary = [10, 20, 30, 40, 50];
let res = ary.slice(1, 3);
console.log(res); //=>[20,30]
// m不写是找到末尾
res = ary.slice(1);
console.log(res); //=>[20, 30, 40, 50]
// 数组的克隆
res = ary.slice();
console.log(res); //=>[10, 20, 30, 40, 50]
-
splice(n,m,x)
- 实现数组的增删改、参数(n,m)都是数字->从索引n删m个元素,m不写就删到末尾、删除的内容用新数组返回。
- splice(n,m,x)->从索引n开始删除m个元素,用x占用删除的部分,删除的内容用新数组返回
- splice(n,0,x)->从索引n开始,一个都不删,把x放到 索引n的前面
数组的克隆
//基于这种方法可以清空一个数组,把原始数组中的内容以新数组存储起来
let ary = [10, 20, 70, 80, 90];
res = ary.splice(0);
console.log(res, ary);//=>[10, 20, 70, 80, 90] []
数组的增加
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var removed = myFish.splice(2, 0, 'drum', 'guitar');
// 运算后的 myFish: ["angel", "clown", "drum", "guitar", "mandarin", "sturgeon"]
// 被删除的元素: [], 没有元素被删除
其他数组方法
-
contact()
- 实现数组拼接
- 多个任意类型值
- 返回拼接后的新数组(原来数组不变)
let ary1 = [10, 20, 30];
let ary2 = [40, 50, 60];
let res = ary1.concat('前端新人', ary2);
console.log(res); =>(7)[10, 20, 30, "前端新人", 40, 50, 60]