每日前端手写题--day8

以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?

第八天要刷的手写题如下:

  1. 实现Array.prototype.concat
  2. 实现Array.prototype.reverse
  3. 实现Array.prototype.sort

下面是我自己写的答案:

1. 实现Array.prototype.concat

  • 作用:Array.prototype.concat 方法用于合并两个或多个数组,返回一个新的数组。它不会修改原始数组,而是创建并返回一个新的数组,其中包含所有被合并的数组的元素。
  • 拆包:如果传入concat的是一个数组,则默认情况下会对其拆包([[[1]]]会被当作[[1]]添加进去
javascript 复制代码
Array.prototype.myConcat = function myConcat (...args) {
  const newArray = [...this]; // 创建新数组并复制原始数组的元素

  for (let i = 0; i < args.length; i++) {
    if (Array.isArray(args[i])) {
      newArray.push(...args[i]); // 将数组参数展开并追加到新数组中
    } else {
      newArray.push(args[i]); // 将非数组参数直接追加到新数组中
    }
  }

  return newArray;
};

2. 实现Array.prototype.reverse

  • 作用:将数组的元素逆序
javascript 复制代码
Array.prototype.myReverse = function myReverse () {
    if(!Array.isArray(this)) throw new Error('must be called by array');
     const _len = this.length;
    if(_len < 2) return this;

    const middle = _len >> 2;
    for (let i = 0; i < middle; i++) {
        [this[i], this[_len - i - 1]] = [this[_len -i - 1], this[i]];
    }
    return this;
}

3. 实现Array.prototype.sort

  • 原理:根据指定的排序方向对数组进行排序。
  • 实现:首先确定排序的方向;然后使用快速排序实现
  • 返回值:原数组
javascript 复制代码
Array.prototype.mySort = function (compareFn) {
  const array = [...this]; // 创建新数组并复制原始数组的元素
  if(array.length < 2) return this;
  // 定义比较函数
  const defaultCompare = (a, b) => {
    if (a === undefined || b === undefined) {
      return 0;
    }
    if (a < b) {
      return -1;
    }
    if (a > b) {
      return 1;
    }
    return 0;
  };

  // 使用传入的比较函数或默认比较函数
  const comparator = compareFn || defaultCompare;

  // 快速排序算法
  const quickSort = (arr) => {
    if (arr.length <= 1) {
      return arr;
    }

    const pivotIndex = arr.length >> 1;
    const pivot = arr.splice(pivotIndex, 1)[0];
    const left = [];
    const right = [];

    for (let i = 0; i < arr.length; i++) {
      const result = comparator(arr[i], pivot);
      if (result === -1) {
        left.push(arr[i]);
      } else {
        right.push(arr[i]);
      }
    }

    return [...quickSort(left), pivot, ...quickSort(right)];
  };

  const sortedArray = quickSort(array);

  // 更新原始数组的元素
  for (let i = 0; i < this.length; i++) {
    this[i] = sortedArray[i];
  }

  return this;
};
相关推荐
i听风逝夜21 分钟前
Web 3D地球实时统计访问来源
前端·后端
iMonster26 分钟前
React 组件的组合模式之道 (Composition Pattern)
前端
呐呐呐呐呢34 分钟前
antd渐变色边框按钮
前端
元直数字电路验证1 小时前
Jakarta EE Web 聊天室技术梳理
前端
wadesir1 小时前
Nginx配置文件CPU优化(从零开始提升Web服务器性能)
服务器·前端·nginx
牧码岛1 小时前
Web前端之canvas实现图片融合与清晰度介绍、合并
前端·javascript·css·html·web·canvas·web前端
灵犀坠1 小时前
前端面试八股复习心得
开发语言·前端·javascript
9***Y481 小时前
前端动画性能优化
前端
网络点点滴1 小时前
Vue3嵌套路由
前端·javascript·vue.js
牧码岛1 小时前
Web前端之Vue+Element打印时输入值没有及时更新dom的问题
前端·javascript·html·web·web前端