返回

编写 JavaScript 原生数组 API 指南

前端

在 JavaScript 中,数组是一种有序的数据结构,可存储任何类型的值。本指南将探讨 JavaScript 原生数组 API 的用法,并提供如何模拟实现这些 API 的示例。

forEach 方法

forEach 方法对数组中的每个元素执行指定的回调函数。语法如下:

array.forEach(callback(currentValue, index, array))

我们可以模拟实现 forEach 方法如下:

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

map 方法

map 方法返回一个新数组,其中每个元素都是原数组中相应元素的回调函数结果。语法如下:

array.map(callback(currentValue, index, array))

模拟实现 map 方法如下:

const myMap = (array, callback) => {
  const newArr = [];
  for (let i = 0; i < array.length; i++) {
    newArr.push(callback(array[i], i, array));
  }
  return newArr;
};

filter 方法

filter 方法返回一个新数组,其中包含满足回调函数条件的所有元素。语法如下:

array.filter(callback(currentValue, index, array))

模拟实现 filter 方法如下:

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

reduce 方法

reduce 方法将数组中的所有元素逐个累积,返回一个最终值。语法如下:

array.reduce(callback(accumulator, currentValue, index, array))

模拟实现 reduce 方法如下:

const myReduce = (array, callback, initialValue) => {
  let accumulator = initialValue || array[0];
  for (let i = initialValue ? 0 : 1; i < array.length; i++) {
    accumulator = callback(accumulator, array[i], i, array);
  }
  return accumulator;
};

find 方法

find 方法返回数组中第一个满足回调函数条件的元素。语法如下:

array.find(callback(currentValue, index, array))

模拟实现 find 方法如下:

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

findIndex 方法

findIndex 方法返回数组中第一个满足回调函数条件的元素的索引。语法如下:

array.findIndex(callback(currentValue, index, array))

模拟实现 findIndex 方法如下:

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

includes 方法

includes 方法判断数组中是否存在某个元素。语法如下:

array.includes(valueToFind, fromIndex)

模拟实现 includes 方法如下:

const myIncludes = (array, valueToFind, fromIndex = 0) => {
  for (let i = fromIndex; i < array.length; i++) {
    if (array[i] === valueToFind) {
      return true;
    }
  }
  return false;
};

sort 方法

sort 方法对数组中的元素进行排序。语法如下:

array.sort([compareFunction])

模拟实现 sort 方法如下:

const mySort = (array, compareFunction) => {
  const newArr = [...array];
  newArr.sort(compareFunction);
  return newArr;
};

reverse 方法

reverse 方法反转数组中的元素顺序。语法如下:

array.reverse()

模拟实现 reverse 方法如下:

const myReverse = (array) => {
  const newArr = [];
  for (let i = array.length - 1; i >= 0; i--) {
    newArr.push(array[i]);
  }
  return newArr;
};

slice 方法

slice 方法返回数组中指定范围的元素。语法如下:

array.slice(start, end)

模拟实现 slice 方法如下:

const mySlice = (array, start = 0, end = array.length) => {
  const newArr = [];
  for (let i = start; i < end; i++) {
    newArr.push(array[i]);
  }
  return newArr;
};

concat 方法

concat 方法返回一个新数组,其中包含原数组和一个或多个附加数组的所有元素。语法如下:

array.concat(array1, ..., arrayN)

模拟实现 concat 方法如下:

const myConcat = (...arrays) => {
  const newArr = [];
  for (const arr of arrays) {
    newArr.push(...arr);
  }
  return newArr;
};

splice 方法

splice 方法删除数组中的元素,并可以添加新元素。语法如下:

array.splice(start, deleteCount, ...itemsToAdd)

模拟实现 splice 方法如下:

const mySplice = (array, start = 0, deleteCount = 0, ...itemsToAdd) => {
  const newArr = [...array];
  newArr.splice(start, deleteCount, ...itemsToAdd);
  return newArr;
};

copyWithin 方法

copyWithin 方法将数组中指定范围内的元素复制到另一个指定的范围。语法如下:

array.copyWithin(target, start, end)

模拟实现 copyWithin 方法如下:

const myCopyWithin = (array, target, start = 0, end = array.length) => {
  const newArr = [...array];
  const arrToCopy = array.slice(start, end);
  newArr.splice(target, 0, ...arrToCopy);
  return newArr;
};

join 方法

join 方法将数组中的所有元素连接成一个字符串。语法如下:

array.join(separator)

模拟实现 join 方法如下:

const myJoin = (array, separator = ',') => {
  let str = '';
  for (let i = 0; i < array.length; i++) {
    str += array[i];
    if (i < array.length - 1) {
      str += separator;
    }
  }
  return str;
};

shift 方法

shift 方法删除数组中的第一个元素并返回该元素。语法如下:

array.shift()

模拟实现 shift 方法如下:

const myShift = (array) => {
  const newArr = [...array];
  const firstElement = newArr[0];
  newArr.splice(0, 1);
  return firstElement;
};

unshift 方法

unshift 方法在数组开头添加一个或多个元素并返回新数组的长度。语法如下:

array.unshift(...itemsToAdd)

模拟实现 unshift 方法如下:

const myUnshift = (array, ...itemsToAdd) => {
  const newArr = [...itemsToAdd, ...array];
  return newArr.length;
};

push 方法

push 方法在数组末尾添加一个或多个元素并返回新数组的长度。语法如下:

array.push(...itemsToAdd)

模拟实现 push 方法如下:

const myPush = (array, ...itemsToAdd) => {
  const newArr = [...array];
  for (const item of itemsToAdd) {
    newArr[newArr.length] = item;
  }
  return newArr.length;
};

pop 方法

pop 方法删除数组中的最后一个元素并返回该元素。语法如下:

array.pop()