let arr = [11,22,33,44,55,66,77,88,99]
console.log('----------------forEach()----------------');
/* forEach()方法,用于循环遍历整个数组,且一定执行完。
该方法的参数是一个回调函数,该回调函数可以传两个参数,
第一个参数是数组中的每一项元素,
第二个参数是每一项元素对应的下标。
注意:第二个参数可以省略。 */
function forEach(arr, callback) {
for(let i = 0; i < arr.length; i++){
callback(arr[i], i)
}
}
forEach(arr, (item, index) => console.log(index + '--' + item))
// 相当于Java中的数组迭代器对象
// forEach()方法中的回调函数可以控制输出对象
// 即在遍历过程中给予一个筛选条件(回调函数),控制数组中元素内数据的依次输出(必定输出完全)
console.log('----------------filter()----------------');
// filter()方法,用于过滤数组中的元素,返回过滤结果
function filter(arr1, callback) {
let arr2 = []
for(let i = 0; i < arr1.length; i++){
if(callback(arr1[i])){
arr2.push(arr1[i])
}
}
return arr2
}
let arr2 = filter(arr, item => item % 2 === 0)
console.log(arr2); // (4) [22, 44, 66, 88]
// filter()方法:
// 原数组不变,返回值为一个经过筛选条件(回调函数)过滤的新数组
// 当然,如果一个函数有返回值,被调用后需要新建一个变量接收该返回值
console.log('----------------find()----------------');
// find()方法,用于获取数组中满足规则的第一个元素,如果没有找到则返回undefined。
function find(arr1, callback) {
let arr2 = []
for(let i = 0; i < arr1.length; i++){
if(callback(arr1[i])){
return arr1[i]
// 一经发现,立马逮捕
}
}
}
let num1 = find(arr, item => item % 3 === 0)
console.log(num1); // 33
// find()方法的返回值:
// 是经过筛选条件(回调函数)找到的第一个符合条件的元素,如果没有找到则返回undefined。
console.log('---------------findIndex()---------------');
// findIndex()方法,用于获取数组中满足规则的第一个元素下标
function findIndex(arr1, callback) {
for(let i = 0; i < arr1.length; i++){
if(callback(arr1[i])){
return i
}
}
return -1
}
let index1 = findIndex(arr, item => item % 3 === 0)
console.log(index1); // 2
let index2 = findIndex(arr, item => item % 300 === 0)
console.log(index2); // -1
// findIndex()方法类似find()方法,返回值为满足条件的元素下标
// 区别:findIndex()方法返回的是数组中满足规则的第一个元素下标
// find()方法返回的是数组中满足规则的第一个元素
// 当然,findIndex()方法调用过程中如果没有找到满足规则的元素,则返回-1
console.log('----------------some()----------------');
// some()方法,用于表示数组中是否有满足指定规则的元素,有返回true,一个都没有返回false
function some(arr, callback) {
for(let i = 0; i < arr.length; i++){
if(callback(arr[i])){
return true
}
}
return false
}
let isOk1 = some(arr, item => item % 3 === 0)
console.log(isOk1); // true
let isOk2 = some(arr, item => item % 31 === 0)
console.log(isOk2); // false
// some()方法又同findIndex()方法,返回值为Boolean型
// 区别:some()方法如果找到了满足指定规则的元素,则返回true;没有找到,则返回false
// findIndex()方法是找到了满足指定规则的元素,则返回该元素下标;没有找到,则返回-1
console.log('----------------every()----------------');
// every()方法,用于表示数组中是否所有元素都满足指定的规则
function every(arr, callback){
for(let i = 0; i < arr.length; i++){
if(!callback(arr[i])){
return false
}
}
return true
}
let isOk3 = every(arr, item => item > 100)
console.log(isOk3); // false
let isOk4 = every(arr, item => item > 10)
console.log(isOk4); // true
// every()方法又同some()方法,返回值也为Boolean型
// 区别:every()方法判断的是全体元素是否皆满足筛选条件(回调函数),
// 皆满足则返回true,只要找到一个不满足条件的元素就返回false
// some()方法则是只要找到一个满足条件的元素就返回true,反之则返回false
console.log('----------------map()----------------');
// map()方法,用于将原始数组里面的数据根据指定的规则返回新的数组
function map(arr1, callback){
let arr2 = []
for(let i = 0; i < arr1.length; i++){
arr2.push(callback(arr1[i]))
}
return arr2
}
let arr3 = map(arr, item => item * 2)
console.log(arr3); // (9) [22, 44, 66, 88, 110, 132, 154, 176, 198]
// map()方法同filter()方法,返回值同样为一个新数组
// 区别:map()方法返回的是经过筛选条件处理过的新数组
// 这个处理的含义为每一个元素都被代入回调函数中运算了,返回了一个新数据
// 将处理后的数据组合成为一个新数组并返回
console.log('----------------sort()----------------');
/* sort()方法,对数组的元素进行排序
回调函数需要传两个参数,返回参数1-参数2是升序,返回参数2-参数1是降序 */
/*
提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
*/
function sort(arr, callback) {
for(let i = 0; i < arr.length - 1; i++){
for(let j = i + 1; j < arr.length; j++){
if(callback(arr[i], arr[j]) > 0){
// 当然,这里只是求个大概意思
// 通过回调函数给这里补个条件
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
}
}
}
sort(arr, (a, b) => a - b)
console.log(arr);
sort(arr, (a, b) => b - a)
console.log(arr);
// sort()方法无返回值,
// 通过元素的值的大小改变元素的顺序,升降序由回调函数决定
// 参数1-参数2是升序,参数2-参数1是降序
console.log('---------------reduce()---------------');
// reduce()方法,统计数组中元素的值(从左到右)
function reduce(arr, callback, initNum) {
for(let i = 0; i < arr.length; i++){
let r = callback(initNum, arr[i])
initNum = r
}
return initNum
}
let sum1 = reduce(arr, (a, b) => a + b, 0)
console.log(sum1); // 495
// reduce()方法返回的是数组中全体元素的值的总和
// 当然也可传第二个参数,为起始值
// 通过该起始值可以实现多个数组值的相加(将上一个数组的总和赋值给第二个参数,以作为第二个数组计算总和的初值)
console.log('----------------reduceRight()----------------');
// reduceRight()方法,统计数组中元素的值(从右到左)
function reduce(arr, callback, initNum) {
for(let i = arr.length - 1; i >= 0; i--){
let r = callback(initNum, arr[i])
initNum = r
}
return initNum
}
let sum2 = reduce(arr, (a, b) => a + b, 0)
console.log(sum2); // 495
// reduceRight()方法同reduce()方法,同样是求元素总和
// 这两个函数没啥区别,不同在于求和顺序