Běží snížit na pole Booleovských funkcí. To vždy vrátí true, a nemůže najít způsob, jak se vymanit z snížit, pokud metoda vrátí false

0

Otázka

Takže mám vytvořit funkci, která má dva vstupy: pole Booleovské funkce a hodnota, běh přes každé z těchto funkcí. Mám vrátí Boolean hodnotu označující, zda je nebo není všechny funkce vrátí true. Pokud alespoň jedna z funkcí vrací false, pak snížit by se měla vrátit hodnotu false.

Problém mám, je, že i když jeden z funkcí vyhodnocen jako false a akumulátor je nastavena na false, pokud tam je další funkce v poli po tom, který vyústí v pravou hodnotu, pak to jen vrací hodnotu true, i když předchozí funkce, bylo falešné.

Něco jsem četl a zdá se, že tam není opravdu způsob, jak se vymanit z běžící snížení metoda.

const allClear = (funcArr, value) => {
    // iterate through funcArr using reduce
  return funcArr.reduce((acc, fn) => {
    if (fn(value) === false) {
      return false;
    } else {
      return true;
    }
  }, false)
}

a zde jsou testovací případy, které tvoří řadu funkcí, stejně jako dvou volání funkce...

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];
console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

Snažil jsem se poměrně málo variací moje funkce, ale bezvýsledně. Hned jak jsem akumulátoru na hodnotu false, bude nastaven zpět na hodnotu pravda další funkce v poli (když už mluvíme o druhé volání funkce s -25) a nemohu přijít na to, jak se vymanit z omezení a return false jednou jsem najít falešný výsledek z provozu prostřednictvím funkce!

Děkuji za jakékoliv tipy nebo pomoc!

arrays boolean javascript reduce
2021-11-19 20:11:26
2
1

Zpětné volání funkce by měla zkontrolovat akumulátor. Pokud je to falseto by jen se vrátit false aniž by se obtěžoval zavolat další funkci, protože to znamená, že alespoň jeden z dřívějších funkce vrátil false.

To také znamená, že počáteční hodnota akumulátoru by měla být true, jinak budete okamžitě zastavit.

Kromě toho, můžete použít !! převést hodnotu fn(value) volání na boolean.

const allClear = (funcArr, value) => {
  // iterate through funcArr using reduce
  return funcArr.reduce((acc, fn) => {
    if (!acc) {
      return false;
    }
    return !!fn(value);
  }, true)
}

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];
console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

2021-11-19 20:17:28

Páni, to je geniální způsob, jak udržet akumulátor falešné! Nikdy by mě to nenapadlo, díky!
DaShaman
1

Můžete vzít Array#every.

const allClear = (funcArr, value) => funcArr.every(fn => fn(value));

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];

console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

S Array#reduce a logické A &&

const allClear = (funcArr, value) => funcArr
        .reduce((r, fn) => r && fn(value), true);

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];

console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

2021-11-19 20:35:31

Díky!!! Měl jsem upřesnit, že pro nějaký hloupý důvod, proč jsem musel použít snížit...
DaShaman

pak budete muset opakovat všechny položky pole ...
Nina Scholz

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................