首页 文章

我使用过滤器吗?我不知道为什么这个解决方案有效

提问于
浏览
1

我现在正在通过FCC基本算法,虽然我通过了练习,但我还没有完全理解它为什么会起作用,因为当我改变我认为它们应该是它不起作用的时候,但当我改变时所以他们看起来错了我仍然有效 .

例如,我将 true 更改为 false ,它仍然有效,或者我只是输入true,它仍然有效,或者我只是说 return value ,它可以工作 . 过滤器会自动删除虚假值吗?

这是我的代码 . 我的原始代码无法正常工作 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]);

从数组中删除所有有 Value 的值 .

JavaScript中的Falsy值为false,null,0,“”,undefined和NaN .

UPDATE

感谢所有答案,他们都非常有助于消除我的困惑 .

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

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

这是我最终重写的解决方案,现在明白为什么我做了我做的事情 .

3 回答

  • 1

    filter 遍历您的数组 . 在每个元素迭代中,调用回调 .

    如果在回调中返回一个“truthy”值,那么元素将保留在结果数组中,否则不会 .

    您的困惑源于您认为需要以某种方式返回 value 参数的事实 . You don't .

    看看这个例子:

    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)
    

    就是这样 .

  • 2

    你的回调,

    if (value !== true)
      return value;
    

    等同于

    return value;
    

    在你的情况下,因为你的数组中没有元素是 true ,所以 value !== true 总是成立 .

    如果你改成它

    if (value !== false)
        return value;
    

    它仍然为大多数数组元素执行 return value; . 唯一的例外是 false ,您的函数返回 undefined (因为没有执行明确的 return 语句) . undefined 是假的,所以它被 return false 视为 return false (因为 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));
    
  • 1

    如果您的目的是返回仅保留truthy值的数组,那么执行以下操作:

    .filter(Boolean)
    

    在回调 filter 时,你不要't always return a value, and if you don' t,这意味着不会保留相应的值 . 此外,对于像 !===== 这样的运营商,您正在进行严格的比较 . 所以 value === true 只会匹配 true ,而不是任何其他真正的 Value . 同样, value !== true 仍将匹配一些真正的值(不是 true ) .

相关问题