JavaScript 手写代码 第六期(重写数组方法二)不改变原数组的方法
    		       		warning:
    		            这篇文章距离上次修改已过439天,其中的内容可能已经有所变动。
    		        
        		                
                
// 不使用原生Array的prototype,实现以下功能:
// - every
// - filter
// - find
// - findIndex
// - forEach
// - map
// - reduce
// - some
 
// 示例数组
const arr = [1, 2, 3, 4, 5];
 
// every
function every(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    if (!callback(arr[i], i, arr)) {
      return false;
    }
  }
  return true;
}
 
// filter
function filter(arr, callback) {
  const result = [];
  for (let i = 0; i < arr.length; i++) {
    if (callback(arr[i], i, arr)) {
      result.push(arr[i]);
    }
  }
  return result;
}
 
// find
function find(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    if (callback(arr[i], i, arr)) {
      return arr[i];
    }
  }
  return undefined;
}
 
// findIndex
function findIndex(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    if (callback(arr[i], i, arr)) {
      return i;
    }
  }
  return -1;
}
 
// forEach
function forEach(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    callback(arr[i], i, arr);
  }
}
 
// map
function map(arr, callback) {
  const result = [];
  for (let i = 0; i < arr.length; i++) {
    result.push(callback(arr[i], i, arr));
  }
  return result;
}
 
// reduce
function reduce(arr, callback, initialValue) {
  let result = initialValue || arr[0];
  for (let i = initialValue ? 0 : 1; i < arr.length; i++) {
    result = callback(result, arr[i], i, arr);
  }
  return result;
}
 
// some
function some(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    if (callback(arr[i], i, arr)) {
      return true;
    }
  }
  return false;
}
 
// 测试这些函数
console.log(every(arr, (item) => item > 0)); // true
console.log(filter(arr, (item) => item > 2)); // [3, 4, 5]
console.log(find(arr, (item) => item > 2)); // 3
console.log(findIndex(arr, (item) => item > 2)); // 2
forEach(arr, (item) => console.log(item)); // 1, 2, 3, 4, 5
console.log(map(arr, (item) => item * 2)); // [2, 4, 6, 8, 10]
console.log(reduce(arr, (acc, item) => acc + item, 0)); // 15
console.log(some(arr, (item) => item > 3)); // true这段代码展示了如何不使用原生JavaScript数组的prototype,手动实现了every, filter, find, findIndex, forEach, map, reduce 和 some 这些方法。每个函数都接收一个数组和一个回调函数,并返回处理后的结果,同时保证原数组不被修改。这是一个很好的学习示例,可以帮助开发者理解这些方法的工作原理。
评论已关闭