使用函数反向回调的返回值-not(callback)

时间:2018-11-07 21:52:34

标签: javascript arrays functional-programming

我具有过滤功能,并向其中传递了测试功能:

var array = [1,3,5,7,9]
function bigger(n){return n > 5}

function filterArray(data,testfn){
  return data.filter(e=> testfn(e))}

console.log(filterArray(array,bigger))
>>>[7,9]

现在的ID喜欢写东西

console.log(filterArray(array,not(bigger)))
>>>[1,3,5]

4 个答案:

答案 0 :(得分:4)

您可以创建一个函数not,该函数接受一个函数并返回另一个函数,该函数返回调用原始函数的结果的反函数:

var array = [1, 3, 5, 7, 9];

function bigger(n) {
  return n > 5
}

function filterArray(data, testfn) {
  return data.filter(e => testfn(e))
}

function not(f) {
  return function(n) {
    return !f(n);
  }
}


console.log(filterArray(array, bigger));
console.log(filterArray(array, not(bigger)));

答案 1 :(得分:1)

您可以执行以下操作:

var array = [1, 3, 5, 7, 9]

const isBiggerThan = (n) => n > 5
const isNot = (fn) => (n) => !fn(n)
const filterArray = (data, testfn) => data.filter(e => testfn(e))    

console.log(filterArray(array, isBiggerThan))
console.log(filterArray(array, isNot(isBiggerThan)))

想法是让isNot函数返回一个函数,该函数简单地否定作为参数函数传递的结果。

答案 2 :(得分:0)

我会做类似以下的事情。

var array = [1,3,5,7,9]
function bigger(n){return n > 5}

console.log(array.filter(element => !bigger(element)))

答案 3 :(得分:0)

要说明可变函数: 在数组“参数”中收集参数,并将其传递给函数。

function not(myFunction){
  if (typeof myFunction != "function"){return !myFunction } 
   return function (...arguments) {
      return !myFunction.apply(null,arguments)
   }
 }

简而言之:

const not = f => (...a) => !f.apply(null,a)

还要使它适用于所有值-检查是否已传递函数。也可以像not(bigger(1,2))这样使用它:

 function not(anything){
  if (typeof anything != "function"){return !anything } 
   return function (...arguments) {
      return !anything.apply(null,arguments)
   }
 }


var variable = true
console.log(not(bigger(6))) >>> true
console.log(not(variable))) >>> false
console.log(not(false))) >>> true

简而言之:

const not = f => typeof f != "function" ? !f : (...a) => !f.apply(null,a)