美文网首页
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