IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript 一些 Array 函数实现 -> 正文阅读

[JavaScript知识库]JavaScript 一些 Array 函数实现

只是一些比较简单的实现,这里按照字母排序了。

Github 链接:js impl

CSDN下载:csdn

concat

因为 concat 可以参数中可以接受多个数组,所以用了 rest operator 去接受多个数组。

const concat = (arr, arr2) => {
  const newArr = [...arr];
  for (let i = 0; i < arrs.length; i++) {
    const arr2 = arrs[i];
    for (let j = 0; j < arr2.length; j++) {
      push(newArr, arr2[j]);
    }
  }
  return newArr;
};

find

for (let i = 0; i < arr.length; i++) {
  const element = arr[i];
  if (cb(element)) return element;
}

return undefined;

flat

flat 是通过递归的方式完成,不过 flat 应该是需要修改原本的数组,那个在递归的操作比较麻烦,这里就直接使用返回一个新的数组的方式了。

const flat = (arr, depth = 1) => {
  const newArr = [];
  for (let i = 0; i < arr.length; i++) {
    const element = arr[i];
    if (element instanceof Array && depth > 0) {
      push(newArr, ...flat(element, depth - 1));
    } else {
      push(newArr, element);
    }
  }

  return newArr;
};

forEach & map

JavaScript 的 foreach 用不了 break/continue?同样写法下 for 循环也不行 里面大致实现过了,这里就不继续了。

includes

indexOf, lastIndexOfincludes 的实现差不多,这里就不重新实现了。

const includes = (arr, val) => {
  for (let i = 0; i < arr.length; i++) {
    const element = arr[i];
    if (element == val) return true;
  }

  return false;
};

join

const join = (arr, separator = ",") => {
  let str = "";
  for (let i = 0; i < arr.length - 1; i++) {
    str += arr[i] + separator;
  }
  str += arr[arr.length - 1];
  return str;
};

pop

const pop = (arr) => {
  const popped = arr[arr.length - 1];
  arr.length--;
  return popped;
};

push

const push = (arr, ...values) => {
  for (let i = 0; i < values.length; i++) {
    arr[arr.length] = values[i];
  }
};

reduce

const reduce = (arr, reducer, initialValue) => {
  let accum = initialValue,
    counter = 0;
  if (!initialValue) {
    accum = arr[0];
    counter++;
  }
  for (let i = counter; i < arr.length; i++) {
    accum = reducer(accum, arr[i], i, arr);
  }

  return accum;
};

reverse

const reverse = (arr) => {
  for (let i = 0; i < arr.length / 2; i++) {
    [arr[i], arr[arr.length - i - 1]] = [arr[arr.length - 1 - i], arr[i]];
  }
};

shift

const shift = (arr) => {
  const shifted = arr[0];
  for (let i = 1; i < arr.length; i++) {
    arr[i - 1] = arr[i];
  }
  arr.length--;
  return shifted;
};

slice

slice 可以接受负值作为参数,这里对此也做了简单的处理。

const slice = (arr, start = 0, end = arr.length) => {
  const arrCopy = [];

  if (start < 0) start = arr.length + start;

  if (end < 0) end = arr.length + end;

  for (let i = start; i < end; i++) {
    push(arrCopy, arr[i]);
  }

  return arrCopy;
};

some

everysome 实现的方法也差不多,这里就不重新 cv 了。

const some = (arr, cb) => {
  for (let i = 0; i < arr.length; i++) {
    if (cb(arr[i], i, arr)) return true;
  }

  return false;
};

sort

sort 原生排序实现根据 runtime 和数组类型不同而有差异,这里就是用最基础的冒泡排序了。

function swap(arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
}

function bubbleSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 1; j < arr.length - i; j++) {
      if (arr[j - 1] > arr[j]) {
        swap(arr, j, j - 1);
      }
    }
  }
}

const sort = (arr, comparator = bubbleSort) => {
  comparator(arr);
};

splice

splice 也是一个相对而言比较复杂的方法了,大概实现内容如下:

const subArr = (arr, start, end = arr.length) => {
  const subArray = [];
  for (let i = start; i < end; i++) {
    subArray.push(arr[i]);
  }

  return subArray;
};

const splice = (arr, start = 0, deleteCount = 0, ...items) => {
  let subArray = null;

  const deleted = [];

  if (items.length > 0 || deleteCount > 0) {
    subArray = subArr(arr, start);
    arr.length -= arr.length - start;
  }

  while (deleteCount > 0) {
    push(deleted, shift(subArray));
    deleteCount--;
  }

  if (items.length > 0) {
    for (let i = 0; i < items.length; i++) {
      push(arr, items[i]);
    }
  }

  if (subArray && subArray.length > 0) {
    for (let i = 0; i < subArray.length; i++) {
      push(arr, subArray[i]);
    }
  }

  return deleted;
};

实现思路就是截取一个 sub array,如果需要删除的话,直接 shift(移除 sub array 头部的内容),随后将 items 和 sub array 中的内容加回原数组即可——splice 会修改原数组。

unshift

const unshift = (arr, val) => {
  for (let i = arr.length; i > 0; i--) {
    arr[i] = arr[i - 1];
  }
  arr[0] = val;
};
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:03:56  更:2022-05-24 18:04:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:29:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码