美文网首页
reduce实现多个实用的数组方法

reduce实现多个实用的数组方法

作者: 一蓑烟雨任平生_cui | 来源:发表于2019-12-18 16:23 被阅读0次

使用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]

相关文章

网友评论

      本文标题:reduce实现多个实用的数组方法

      本文链接:https://www.haomeiwen.com/subject/uckpwctx.html