Вопрос о возврате логического значения из функции редуктора - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь выяснить, почему в моей функции-редукторе isTrue может переключаться на true с false, но не обратно на false при обнаружении функции, которая возвращает false.Я просто пытаюсь понять, почему это может перевернуться в одну сторону, а не в другую.

Я знаю, что переворот происходит в return isTrue || val(num);

Направления были "// определяют функцию" passOne ", которая принимает два аргумента, первый - любое значение, а второй - массив функций.Эти функции могут рассматриваться как тесты, так как все они будут возвращать либо true, либо false. «PassOne» будет выполнять итерацию / цикл по массиву и передавать значение каждой функции в качестве аргумента. Если хотя бы одна функция (test) возвращает true,«passOne» вернет true. Если ни одна из функций не вернет true, «passOne» вернет false. // используйте ваш «passOne», чтобы определить, является ли число 113 отрицательным, даже, ИЛИ имеет 1 в качестве первой цифры. Затем проверьте213. "

Я пытался визуализировать это в Python Tutor.

function isNeg(num){
  return num < 0 ? true: false;
}

function isEven(num){
  return num % 2 === 0 ? true : false;
}

function oneDig(num){
  return (num.toString())[0] === `1` ? true : false;
}

const funcs = [oneDig, isNeg, isEven];

// refactor "passOne" so that it uses the built-in "reduce" method instead of a "for" loop

function passOne(num, arr){
  return arr.reduce((isTrue, val) => {
    return isTrue || val(num);
  }, false);
}

console.log(passOne(113, funcs)); //true
console.log(passOne(213, funcs)); //false

код работает должным образом, я просто не понимаю, почему обратные вызовы, которые возвращают «ложь», не переворачивают isTrue обратно на «ложь», как он остается?true, а затем не обновлять до false, не то, что в инструкциях сказано делать, мне просто любопытно.

Ответы [ 4 ]

1 голос
/ 07 июня 2019

Никогда не может стать false снова, когда isTrue становится true.

Потому что вы используете оператор ||. Рассмотрим isTrue это true. Тогда не имеет значения, какой обратный вызов возвращает все значение, будет true.

console.log(true || false)

Вам на самом деле не нужен reduce() здесь, потому что одно из условий истинно, вам не нужно проверять дальше. В этом случае вы должны использовать some().

const passOne = (num, arr) => arr.some(x => x(num))

Если вы хотите перевернуть, значит, вы хотите, чтобы код проверял все условия. Тогда вам нужно использовать оператор &&. И передать true вместо false на reduce()

function isNeg(num){
  return num < 0 ? true: false;
}

function isEven(num){
  return num % 2 === 0 ? true : false;
}

function oneDig(num){
  return (num.toString())[1] === `1` ? true : false;
}

const funcs = [oneDig, isNeg, isEven];

// refactor "passOne" so that it uses the built-in "reduce" method instead of a "for" loop

function passAll(num, arr){
  return arr.reduce((isTrue, val) => {
    return isTrue && val(num);
  }, true);
}

console.log(passAll(113, funcs)); //false
console.log(passAll(213, funcs)); //false
console.log(passAll(-122, funcs)) //true

Или другой способ сделать это every()

const passOne = (num, arr) => arr.every(x => x(num))
0 голосов
/ 07 июня 2019

Я бы использовал some, который проверяет, прошел ли хотя бы один элемент в массиве тест, реализованный предоставленной функцией.

const isNeg = num => num < 0;
const isEven = num => num % 2 === 0;
const oneDig = num => (num.toString())[0] === `1`;
const passOne = (num, arr) => arr.some(fn => fn(num));

const funcs = [oneDig, isNeg, isEven];

console.log(passOne(113, funcs)); //true
console.log(passOne(213, funcs)); //false
0 голосов
/ 07 июня 2019

Для 113 *

аккумулятор инициализирован false.Поэтому в первый раз isTrue будет ложным .Таким образом, он выполняет val(num).

Логическое ИЛИ перейдет к следующему условию, если оно ложно, в противном случае оно не будет выполнено.

oneDig - первый элемент в обр.oneDig проверяет, что первая цифра этого числа равна 1.

, поэтому для 113 первая цифра равна 1. Таким образом, она возвращает true.Ведь для других двух val (num) не выполняется, поскольку isTrue = true удовлетворяет LogicalOR.

Для 213

oneDig возвращает false.Таким образом, он переходит к val (num)

isNeg также возвращает false.Таким образом, он снова возвращается к val (num)

, наконец, isEven также возвращает false.

Таким образом, все равно, что Array.prototype.some проверить, что любая функция в arr возвращает true, а затем, наконец, возвращает true, иначепроверить все функции и, если ничего не вернет true, вернет false

0 голосов
/ 07 июня 2019

Вы можете взять Array#some вместо Array#reduce и вернуть результат обратного вызова.

const
    isNeg = num => num < 0,
    isEven = num => num % 2 === 0,
    oneDig = num => num.toString()[0] === '1',
    funcs = [oneDig, isNeg, isEven],
    passOne = (num, arr) => arr.some(fn => fn(num));

console.log(passOne(113, funcs)); //true
console.log(passOne(213, funcs)); //false
...