Обратное возвращаемое значение обратного вызова с функцией - нет (обратный вызов) - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть функция фильтрации, и я передаю ей функцию тестирования:

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]

теперь хотелось бы иметь возможность писать

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

Ответы [ 4 ]

0 голосов
/ 08 ноября 2018

Чтобы учесть функции вариации: Сбор аргументов в массиве «arguments» и передача их функции.

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)
0 голосов
/ 08 ноября 2018

Я бы сделал что-то вроде следующего.

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

console.log(array.filter(element => !bigger(element)))
0 голосов
/ 08 ноября 2018

Вы можете сделать что-то вроде этого:

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 возвращала функцию, которая просто сводит на нет результат переданного в качестве параметра параметра.

0 голосов
/ 08 ноября 2018

Вы можете создать функцию 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...