欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手动实现数组方法

程序员文章站 2022-06-09 16:58:03
...

手动实现 Array.prototype.map 方法


  map() 方法创建一个新数组,
  其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
  function map(arr, mapCallback) {
    if (Array.isArray(arr) || !arr.length
     || mapCallback !== 'function') {
      return [];
    } else {
      let result = [];
      // 每次调用此函数时,我们都会创建一个 result 数组
      // 因为我们不想改变原始数组。
      for (let i = 0; i < arr.length; i++) {
        result.push(mapCallback(arr[i], i, arr))
      }
      return result;
    }
  }

手动实现Array.prototype.filter方法

filter() 方法创建一个新数组,
 其包含通过所提供函数实现的测试的所有元素。

 function map(arr, filterCallback) {
    // 首先,检查传递的参数是否正确。
    if (!Array.isArray(arr) || !arr.length || typeof filterCallback !== 'function') {
      return [];
    } else {
      let result = [];
      // 每次调用此函数时,我们都会创建一个 result 数组
      // 因为我们不想改变原始数组。
      for (let i = 0, len = arr.length; i < len; i++) {
        if (filterCallback(arr[i], i, arr)) {
          result.push(arr[i]);
        }

        // 将 mapCallback 返回的结果 push 到 result 数组中
      }
      return result;
    }
  }

reduce()

方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行)
将其结果汇总为单个返回值。



  function reduce(arr, reduceCallback, initialValue) {
    // 首先,检查传递的参数是否正确。
    if (!Array.isArray(arr) || !arr.length ||
     typeof reduceCallback !== 'function') {
      return [];
    } else {
      // 如果没有将initialValue传递给该函数,
      //我们将使用第一个数组项作为initialValue
      let hasInitialValue = initialValue !== undefined;
      let value = hasInitialValue ? initialValue : arr[0];

      // 如果有传递 initialValue,则索引从 1 开始,否则从 0 开始
      for (let i = hasInitialValue ?
       1 : 0, len = arr.length; i < len; i++) {
        value = reduceCallback(value, arr[i], i, arr);
      }
      return value;
    }
  }