首页 > 解决方案 > 如何重构这个高阶函数

问题描述

我在尝试重构这个“每个”函数以使其使用内置的“减少”方法时遇到了一些麻烦。

这是 Javascript

const greaterThan5 = num => true ? num > 5 : false;

function every(array, callback) {
    for (let element of array) {
        if (callback(element) === false) return false
      }
    return true;
}

function every (array, callback) {
    return array.reduce(function (acc, cur){
     // IDK what to put here
    }, callback(array[0]) 
}

console.log('expected : false', every([10, -20, 30], greaterThan5))
console.log('expected : true', every([10, 20, 30], greaterThan5))

标签: javascriptreduce

解决方案


我会做这样的事情:

function every(array, callback) {
  return array.reduce(function(acc, cur) {
    if (acc) {
      return callback(cur);
    }
    return false;
  }, true);
}

唯一的区别是,第一个解决方案将在第一个解决方案中停止,false而带有的解决方案将reduce()继续进行,直到检查所有数组元素。

测试

function every(array, callback) {
  return array.reduce(function(acc, cur) {
    if (acc) {
      return callback(cur);
    }
    return false;
  }, true);
}

console.log(every([1,2,3,4], (n) => n < 5));
console.log(every([1,2,5,4], (n) => n < 5));

reduce()它之后不会停止false

function every(array, callback) {
  return array.reduce(function(acc, cur) {
    console.log("Checking " + cur + "...");
    if (acc) {
      return callback(cur);
    }
    return false;
  }, true);
}

console.log(every([1,2,3,4], (n) => n < 5));
console.log(every([1,2,5,4], (n) => n < 5));


推荐阅读