JS手动实现数组方法

286 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

手动实现数组的一些方法,可以更好的帮助我们理解这些方法的用途

every( )

<script>
      Array.prototype.myEvery = function (fn) {
        let f = true
        for (let i = 0; i < this.length; i++) {
          let f = fn(this[i])
          if (!f) {
            //只要有一个不符合,立马返回false
            return false
          }
        }
        return f
      }

      var arr = [11, 33, 55, 21, 35, 12]
      let res = arr.myEvery(function (item) {
        return item > 10
      })
      console.log(res) //true
    </script>

filter( )

<script>
      Array.prototype.myFilter = function (fn) {
        var newArray = []
        for (var i = 0; i < this.length; i++) {
          var f = fn(this[i])
          if (f) {
            newArray.push(this[i])
          }
        }
        return newArray
      }
      var array = [63, 75, 56, 89, 53]
      var arr = array.myFilter(function (item) {
        return item > 70
      })
      console.log(arr) //[75, 89]
    </script>

find( )

<script>
      Array.prototype.myFind = function (fn) {
        for (let i = 0; i < this.length; i++) {
          //this指向调用者(数组)
          var f = fn(this[i])
          if (f) {
            //如果经过fn处理后的f不为空
            return this[i] //则返回对应的数组元素
          }
        }
      }
      var arr = [1, 3, 6, 9, 12]
      var result = arr.myFind(function (item) {
        return item > 6
      })
      console.log(result) //9
    </script>

map( )

<script>
      Array.prototype.myMap = function (fn) {
        let newArray = []
        for (let i = 0; i < this.length; i++) {
          let f = fn(this[i], i, this)
          newArray.push(f)
        }
        return newArray
      }

      var arr = [1, 3, 6, 90, 22]
      var res = arr.myMap(function (element, index, array) {
        console.log(index)
        return element + 1
      })
      console.log(res)
      //0
      //1
      //2
      //3
      //4
      //[2, 4, 7, 91, 23]
    </script>

reduce( )

<script>
      Array.prototype.myReduce = function (fn, initalValue) {
        //如果没有传递initialValue,我们将使用数组的第一项作为initialValue的值
        let hasInitalValue = initalValue !== undefined
        let value = hasInitalValue ? initalValue : this[0]
        ////如果没有传递initialValue,则索引从1开始,否则从0开始
        for (let i = hasInitalValue ? 0 : 1; i < this.length; i++) {
          value = fn(value, this[i], i, this)
        }
        return value
      }
      var arr = [1, 2, 3, 4, 5, 6]
      var sum = arr.myReduce(function (accumulator, currentValue) {
        return accumulator + currentValue
      }, 0)
      console.log(sum) //21
    </script>

some( )

<script>
      //some
      //   `some()` 方法让数组中的每一个元素执行一次回调函数,
      //   在该回调函数中执行一些操作,只要有一个操作结果为真,就会返回true。
      //   不会在对后面的元素进行判断,否则返回false。
      Array.prototype.mySome = function (fn) {
        for (let i = 0; i < this.length; i++) {
          let f = fn(this[i])
          if (f) {
            return f
          }
        }
        return false
      }

      let array = [1, 3, 5, 7, 90]
      let res = array.mySome(function (item) {
        return item > 10
      })
      console.log(res) //true
    </script>

数组去重

<script>
      var arr = [1, 2, 3, 4, 5, 5, 6, 7, 7]
      //使用数组去重
      function fn1(array) {
        var newArray = []
        for (let i = 0; i < array.length; i++) {
          if (newArray.indexOf(array[i]) === -1) {
            newArray.push(array[i])
          }
        }
        return newArray
      }
      console.log(fn1(arr)) //[1, 2, 3, 4, 5, 6, 7]

      //使用键值对去重
      function fn2(array) {
        let obj = {},
          result = [],
          val
        for (let i = 0; i < array.length; i++) {
          val = array[i]
          if (!obj[val]) {
            obj[val] = true
            result.push(val)
          }
        }
        return result
      }
      var arr2 = [1, 2, 3, 4, 5, 5, 6, '6']
      console.log(fn2(arr2)) //[1, 2, 3, 4, 5, 6]

      //使用键值对去重改进
      function fn3(array) {
        var obj = {},
          result = [],
          val,
          type
        for (var i = 0; i < array.length; i++) {
          val = array[i]
          type = typeof val
          if (!obj[val]) {
            //判断元素存在不存在,如果不存在
            obj[val] = [type] //把类型作为key的value
            result.push(val)
          } else if (obj[val].indexOf(type) < 0) {
            //如果元素存在,obj[val]寸的是数组,数组中是对应的类型
            //看看有没有type这个类型,小于0说明没有用这个类型,新类型同样要push
            obj[val].push(type)
            result.push(val)
          }
        }
        return result
      }
      var arr = [1, 2, 3, 4, 5, 5, 6, '6']
      console.log(fn3(arr))

      //利用set去重
      function fn4(arr) {
        return Array.from(new Set(arr))
      }
      var arr = [1, 2, 3, 4, 5, 5, 6, '6']
      console.log(fn4(arr))
    </script>

数组中出现最多的元素

function fn(arr) {
        var result = {}
        var maxNum = 0
        var maxElement = null
        for (var i = 0; i < arr.length; i++) {
          var val = arr[i]
          result[val] === undefined ? (result[val] = 1) : result[val]++
          if (result[val] > maxNum) {
            maxNum = result[val]
            maxElement = val
          }
        }
        return '出现最多的是' + maxElement + ',一共出现了' + maxNum + '次'
      }
      var array = [1, 2, 3, 3, 3, 6, 6, 6, 6, 6, 7, 8, 9]
      console.log(fn(array)) //出现最多的是6,一共出现了5次