每日前端手写题--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;
};
相关推荐
Rain的Java大神之路1 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
百万蹄蹄向前冲2 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙2 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
淡海水2 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
linux_cfan3 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen4 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理4 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒5 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche15005 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情6735 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具