/**
*
* @param {Array} arr
* @param {Function} callback
* @param {初始值} initValue
* @returns
*/
function reduce(arr, callback, initValue) {
if (!Array.isArray(arr)) {
throw ('The arr must be a array')
return
}
if (typeof callback !== 'function') {
throw ('The parameter must be a function')
return
}
let result = initValue //声明变量
// 执行回调
for (let i = 0; i < arr.length; i++) {
// 执行回调
result = callback(result, arr[i], arr)
}
return result
}
3、filter()
filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
/**
*
* @param {Array} arr
* @param {Function} callback
* @returns
*/
function filter(arr, callback) {
if (!Array.isArray(arr)) {
throw ('The arr must be a array')
return
}
if (typeof callback !== 'function') {
throw ('The parameter must be a function')
return
}
let result = [] // 声明空数组,为返回满足条件的元素返回新数组做准备
for (let i = 0; i < arr.length; i++) {
// 执行回调
if (arr[i] === undefined) continue;
if (callback(arr[i], i, arr)) result.push(arr[i]); //如果这里用result[i]=arr[i]; 结果是[empty,2,empty,4......]
}
return result
}
4、find()
find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。
/**
*
* @param {Array} arr
* @param {Function} callback
* @returns
*/
function find(arr, callback) {
if (!Array.isArray(arr)) {
throw ('The arr must be a array')
return
}
if (typeof callback !== 'function') {
throw ('The parameter must be a function')
return
}
// 遍历数组
for (let i = 0; i < arr.length; i++) {
// 执行回调
let res = callback(arr[i], i)
// 判断
if (res) {
// 返回当前正在遍历的元素
return arr[i]
}
}
// 如果没有遇到满足条件的,则返回undefined
return undefined
}
/**
*
* @param {Array} arr
* @param {Function} callback
* @returns
*/
function findIndex(arr, callback) {
if (!Array.isArray(arr)) {
throw ('The arr must be a array')
return
}
if (typeof callback !== 'function') {
throw ('The parameter must be a function')
return
}
// 遍历数组
for (let i = 0; i < arr.length; i++) {
// 执行回调
let res = callback(arr[i], i)
// 判断
if (res) {
// 返回当前正在遍历的元素的下标
return i
}
}
// 如果没有遇到满足条件的,则返回undefined
return -1
}
6、every()
every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
/**
*
* @param {Array} arr
* @param {Function} callback
* @returns
*/
function every(arr, callback) {
if (!Array.isArray(arr)) {
throw ('The arr must be a array')
return
}
if (typeof callback !== 'function') {
throw ('The parameter must be a function')
return
}
// 遍历数组
for (let i = 0; i < arr.length; i++) {
//执行回调,如果回调执行结果为false
if (!callback(arr[i], i)) {
return false
}
}
// 如果都满足条件,则返回true
return true
}