数组常用几个方法(sort、find、findIndex、filter、map、reduce、includes)的简单实现、

该文章展示了如何使用JavaScript实现数组的常见方法,如mSort(排序)、mFind(查找元素)、mFindIndex(查找元素索引)、mFilter(过滤)、mMap(映射)、mIncludes(包含检查)以及mReduce(累加)。这些方法的实现有助于理解数组操作的底层逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、index.html文件

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数组常用方法实现/使用</title>
</head>

<body>
  <script src="./Array.js"></script>

  <!-- 数组一些常用方法,实现 -->
  <script>
    const testBuf = [
      { name: '苹果', price: 3000 },
      { name: '小米', price: 1800 },
      { name: '华为', price: 2000 },
    ]
    const testBuf2 = [1, 2, 3, 4, 5]
    /**
     * a>b升序 a排b后面
     * a<b降序 a排b前面
     * 经过排序,数组顺序会改变
     */
    console.log('mSort', mSort(testBuf, (a, b) => a.price - b.price))

    /**
     * 查找元素,返回元素 
     */
    console.log('mFind', mFind(testBuf, (item) => item.name === '小米'))
    console.log('mFindIndex', mFindIndex(testBuf, (item) => item.name === '小米'))

    /**
     * filter方法实现
     */
    console.log('mFilter', mFilter(testBuf, (item) => item.price > 1800))

    /**
      * map方法实现
      */
    console.log('mMap', mMap(testBuf, (item) => `${item.name}新年快乐`))

    /**
      * includes方法实现
      */
    console.log('mIncludes', mIncludes(testBuf2, 3))

    /**
     * includes方法实现
     */
    console.log('mReduces', mReduces(testBuf, (pre, cur, index, arr) => {
      return pre += cur.price
    }, 0))
    console.log('reduce', testBuf.reduce((pre, cur, index, arr) => {
      return pre += cur.price
    }, 0))

    console.log('mReduces', mReduces(testBuf2, (pre, cur, index, arr) => {
      // return pre += cur
      pre = pre > cur ? pre : cur
      return pre
    }))
    console.log('reduce', testBuf2.reduce((pre, cur, index, arr) => {
      return pre += cur
    }))
  </script>

  <!-- 数组一些方法查漏补缺 -->
  <script>
    /**
     * 插入的值,开始位置,结束位置(超过则按照数组最大长度填充),
     * [1,2,3] ==> [1,6,6]
     */
    // console.log([1, 2, 3].fill(6, 1, 5));

    /**
     * 用于判断是不是数组
     * 是返回true 不是返回false
     */
    // console.log(Array.isArray(1));

    /**
     * 用于将带length属性的数据变成数组
     * 也可以将dom列表变成数组
     */
    // console.log(Array.from(new Set([1, 2, 3]), (value) => {
    //   console.log(value)
    //   // 不retrun则得到的值是undefined,加上回调作用有点类似于map
    //   return value
    // }));
  </script>
</body>

</html>

2、arrray.js文件

/**
 * @description sort 的实现
 * @params1 数组
 * @params2 callback
 * @return 返回一个排好序的数组
 */
function mSort (array, callback) {
  if (!Array.isArray(array)) return []

  for (let i = 0; i < array.length; i++) {
    for (let j = 0; j < array.length - 1 - i; j++) {
      if (callback(array[j + 1], array[j]) < 0) {
        [array[j], array[j + 1]] = [array[j + 1], array[j]]
      }
    }
  }

  return array
}

/**
 * @description find 的实现
 * @params1 数组
 * @params2 callback
 * @return 返回找到的值
 */
function mFind (array, callback) {
  if (!Array.isArray(array)) return

  for (let i = 0; i < array.length; i++) {
    if (callback(array[i], i, array)) {
      return array[i]
    }
  }
}

/**
 * @description findIndex 的实现
 * @params1 数组
 * @params2 callback
 * @return 将找到的值的下标返回
 */
function mFindIndex (array, callback) {
  if (!Array.isArray(array)) return

  for (let i = 0; i < array.length; i++) {
    if (callback(array[i], i, array)) {
      return i
    }
  }

  return -1
}

/**
 * @description filter 的实现
 * @params1 数组
 * @params2 callback
 * @return 返回一个经过过滤的数组
 */
function mFilter (array, callback) {
  if (!Array.isArray(array)) return

  const tmpBuf = []
  for (let i = 0; i < array.length; i++) {
    if (callback(array[i], i, array)) {
      tmpBuf.push(array[i])
    }
  }

  return tmpBuf
}

/**
 * @description map 的实现
 * @params1 数组
 * @params2 callback
 * @return 返回一个映射后的数组
 */
function mMap (array, callback) {
  if (!Array.isArray(array)) return

  const tmp = [...array]

  for (let i = 0; i < array.length; i++) {
    tmp[i] = callback(tmp[i], i, tmp)
  }

  return tmp
}

/**
 * @description includes 的实现
 * @params1 数组
 * @params2 callback
 * @return 包含返回true 不包含返回 false
 */
function mIncludes (array, value) {
  if (!Array.isArray(array)) return

  for (let i = 0; i < array.length; i++) {
    if (array[i] === value) return true
  }

  return false
}


/**
 * @description reduce 的实现
 * @params1 数组
 * @params2 callback
 * @return 返回经过处理后的数组
 */
function mReduces (array, callback, initData) {
  if (!Array.isArray(array)) return

  let pre = undefined
  let i = 0
  if (initData !== undefined) {
    pre = initData
  } else {
    pre = array[0]
    i = 1
  }

  for (; i < array.length; i++) {
    pre = callback(pre, array[i], i, array)
  }

  return pre
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZL随心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值