JavaScript 手写代码 第六期(重写数组方法二)不改变原数组的方法
// 不使用原生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
这些方法。每个函数都接收一个数组和一个回调函数,并返回处理后的结果,同时保证原数组不被修改。这是一个很好的学习示例,可以帮助开发者理解这些方法的工作原理。
评论已关闭