使用reduce实现数组自身的以及其他实用的方法。此处不考虑性能,仅仅通过reduce去实现一些方法以体现reduce的强大。
const arr = [1, 2, 3, 4, 5]
some
for循环实现方式:
function some(callback, arr) {
let flag = false
for(let i = 0; i <= arr.length; i++) {
if (callback(arr[i])) {
flag = true
break
}
}
return flag
}
reduce实现方式:
const some = (callback, array) => array.reduce((pre, cur) => pre || callback(cur), false)
通过reduce实现的some会有性能问题,因为通过for循环实现的,一旦遇到有满足条件的会立即跳出循环,而用reduce即便遇到满足条件的,还会继续遍历执行完整个数组。因为每遍历一次都会执行一次函数,无疑会造成性能问题。
every
const every = (callback, array) => array.reduce((pre, cur) => pre && callback(cur), true)
every(item => item > 0, arr) // true
和some同样的,有性能问题。
none
没有一项满足条件,返回true,如果有一项满足条件则返回false
const none = (callback, array) => !array.reduce((pre, cur) => pre || callback(cur), false)
// 或者
const none = (callback, array) => array.reduce((pre, cur) => pre && !callback(cur), true)
none(item => item % 2 === 0, arr) // false
map
const map = (callback, array) => array.reduce((pre, cur) => pre.push(callback(cur)) && pre, [])
map(item => item * 3, arr) // [3, 6, 9, 12, 15]
map(item => item.concat(0), [[1], [2], [3]]) // [[1, 0], [2, 0], [3, 0]]
filter
const filter = (callback, array) => array.reduce((pre, cur) => callback(cur) && pre.concat(cur) || pre, [])
filter(item => item > 2, arr) // [3, 4, 5]
reject
把所有不满足条件的过滤出来
const reject = (callback, array) => array.reduce((pre, cur) => !callback(cur) && pre.concat(cur) || pre, [])
reject(item => item % 2 === 0, arr) // [1, 3, 5]
find 返回满足条件的第一个元素
const find = (callback, array) => array.reduce((pre, cur) => pre || (callback(cur) && cur), null)
find(item => item % 2 === 0, arr) // 2
partition
把数组中的元素根据回调的返回值划分到两个数组,回调结果为true的划分到数组1,false的划分到数组2
const partition = (callback, array) => array.reduce((pre, cur) => (callback(cur) && pre[0].concat(cur) || pre[1].concat(cur)) && pre, [[], []])
partition(item => item > 3, arr) // [[4, 5], [1, 2, 3]]
pluck
提取数组每一项中key的值
const pluck = (key, array) => array.reduce((pre, cur) => pre.concat(cur[key]), [])
pluck('name', [{ name: 'Batman' }, { name: 'Robin' }, { name: 'Joker' }]) // ['Batman', 'Robin', 'Joker']
pluck(0, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]) // [1, 4, 7]
网友评论