Я использую фильтр правильно?Я не знаю, почему это решение работает - PullRequest
0 голосов
/ 08 декабря 2018

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

Например, я изменяю true на false, и он все еще работает, или я просто набираю true, и он все еще работает, или я просто говорю return value, и это работает.Фильтр автоматически удаляет значения falsy ?

Вот мой код.Мой оригинальный код, который не работал, сказал if (value === true).

function bouncer(arr) {
  let x = arr.filter(value => {
    if (value !== true)
      return value;
  })
  console.log(x);
  return x;
}   

bouncer([7, "ate", "", false, 9]);

Удалить все ложные значения из массива.

Ложные значенияв JavaScript это false, null, 0, "", undefined и NaN.

ОБНОВЛЕНИЕ

Спасибо за все ответы, все они были очень полезны при очисткемое замешательство.

function bouncer(arr) {
  let x = arr.filter(ages => {
    return ages;
  })
  return(x);
}

bouncer([7, "ate", "", false, 9]);

Это решение, которое я переписал, и теперь понимаю, почему я сделал то, что сделал.

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Ваш обратный вызов,

if (value !== true)
  return value;

эквивалентен просто

return value;

в вашем случае, потому что ни один из элементов в вашем массиве не равен true, поэтому value !== true всегда выполняется.

Если вы измените его на

if (value !== false)
    return value;

, он все равно будет выполнять return value; для большинства элементов массива.Единственное исключение - false, для которого ваша функция возвращает undefined (поскольку не выполняется явный оператор return).undefined является ложным, поэтому он обрабатывается так же, как return false на filter (потому что filter заботится только о том, вернул ли обратный вызов истинное или ложное значение).Таким образом, в конце концов, не возвращая значение, если элемент false совпадает с return value.

С другой стороны, если вы измените его на

if (value === true)
    return value;

, тогда вашобратный вызов вернет true, если текущий элемент true, и вернет undefined для любого другого значения.Чистым эффектом является удаление всех элементов, которые не являются true (что в вашем случае является всеми элементами, потому что ваш входной массив не содержит true).

Если вы хотите удалить ложные значения, вы можете простоскажем

arr.filter(value => { return value; })
// or:
arr.filter(value => value)

, потому что вы используете само значение в качестве условия: все, что выглядит ложно, удаляется filter;все, что выглядит правдоподобно, сохраняется.

Если вы считаете, что это сбивает с толку, возможно, глядя на эту пользовательскую (и упрощенную) реализацию filter, все проясняется:

function my_filter(arr, fn) {
    var results = [];
    for (var i = 0; i < arr.length; i++) {
        if (fn(arr[i])) {
            results.push(arr[i]);
        }
    }
    return results;
}

// Usage would be something like:

console.log(my_filter([7, "ate", "", false, 9], value => value));
0 голосов
/ 08 декабря 2018

Если ваша цель - вернуть массив, который содержит только истинные значения, то сделайте следующее:

.filter(Boolean)

При обратном вызове filter вы не всегда возвращаете значение, и если выне означает, что соответствующее значение не будет сохранено.Кроме того, с такими операторами, как !== и ===, вы проводите строгое сравнение.Таким образом, value === true будет только соответствовать true, а не любому другому истинному значению.Точно так же, value !== true все равно будет соответствовать некоторым истинным значениям (которые не true).

0 голосов
/ 08 декабря 2018

filter перебирает ваш массив.В каждой итерации элемента вызывается обратный вызов.

Если вы возвращаете «истинное» значение в обратном вызове, то этот элемент сохраняется в результирующем массиве, в противном случае это не так.

Ваша путаница связана с тем, что вам нужно вернутьvalue аргумент в некотором роде. Вы не .

Посмотрите на этот пример:

var animals = ['dog', 'dog', 'cat', 'cat']

var cats = animals.filter(value => {
  if (value === 'cat') {
    return true
  } else {
    return false
  }
})

console.log(cats)

Конечно, вышеизложенное можно упростить до этого:

var animals = ['dog', 'dog', 'cat', 'cat']

var cats = animals.filter(value => {
  return value === 'cat'
})

console.log(cats)

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...