【问题标题】:JavaScript function arguments for filter function过滤器函数的 JavaScript 函数参数
【发布时间】:2012-06-27 22:49:30
【问题描述】:
numbers = [1,2,3,4,5,4,3,2,1]; 
var filterResult = numbers.filter(function(i){
    return (i > 2);
});       

我不明白这是如何工作的。如果我省略 i 作为函数参数,它会破坏函数,但 i 不绑定到任何东西,为什么它需要在那里?

【问题讨论】:

  • 所以过滤器函数使用 i 作为传递数字索引处的值的一种方式? javascript 去获取每个元素,我只需要告诉它如何处理 i?
  • 简单来说:如果您在数组上调用 filter(),JavaScript 会获取该数组的每个值并调用您指定的函数(在本例中为 function(i) { return (i > 2); } 并调用该函数,传递作为该函数的参数处理的当前值。由于您将函数接受的第一个参数命名为“i”,因此您现在可以在该函数中使用变量 i。如果它返回“true”,则value 将在 filter() 返回的新数组中,如果返回“false”,将被跳过。这样,您可以轻松“过滤”一个数组。
  • 另请参阅下面 Hamish 的回答,有一个很好的解释!
  • 谢谢大家,我在学校大部分时间都在编写 c++ 代码,所以不必手动完成所有事情的想法让我有点震惊

标签: javascript filter


【解决方案1】:

.filter (Array.prototype.filter) 使用 3 个参数调用提供的函数:

function(element, index, array) {
    ...
  • element 是调用的特定数组元素。
  • index 是元素的当前索引
  • array 是被过滤的数组。

您可以使用任何或所有参数。

在您的情况下,i 指的是element,并在您的函数体中使用:

function(i){
    return (i > 2);
}

换句话说,“过滤element大于2的元素”

【讨论】:

  • 谢谢 Hamish,所以我可以在数组数组上调用过滤器?那是索引和元素所指的吗?而且我不确定我是否理解传递数组部分。当我说 numbers.filter 时,这不是已经涵盖了。如果我不包含任何内容,javascript 是否会传递 this 指针?
  • 如果数组是数组的数组,element 将是一个数组。这样说来,对于函数的每次调用,element == array[index]。不知道您评论中的最后一句话是什么意思,抱歉。
  • 如果我省略了数组和索引,就像我在示例中使用 i 而不是元素、索引、数组一样,那么 javascript 会自动传递索引和数组吗?我不确定为什么需要或想要包含索引和数组?
  • indexarray 被传递,如果你需要的话。如果您的特定过滤器不需要它们,则无需担心它们。还有其他过滤器可能依赖于indexarray 中的其他元素,因此为这些情况提供了它们。
【解决方案2】:

i 是在闭包内时对集合中当前对象的引用。它可以被命名为任何东西,因为它只是一个变量,但在闭包内必须具有相同的名称。您可以使用回调,而不是使用 function(){},这就是 filter 的设计方式。

引用是由.filter 的定义隐式完成的,您可以在此处阅读更多内容:http://msdn.microsoft.com/en-us/library/ff679973(v=vs.94).aspx

【讨论】:

    【解决方案3】:

    i 其实很重要。它告诉过滤器函数有关它所作用的元素的信息。事实上,这里就使用了(i > 2)

    这会保留值大于 2 的元素。

    【讨论】:

      【解决方案4】:

      i 是您提供给.filter() 的函数的形式参数。如果您不插入它,该函数将无法引用它正在传递的参数(函数体内的 i 将引用甚至可能未定义的其他实体——window.i 将是典型的)。


      ¹这在技术上是一个谎言,但在本次讨论中认为这是真的

      【讨论】:

        【解决方案5】:

        确实是一个旧线程,但只是填补了未说的内容。

        括号是供程序员插入对您的特定程序有意义的任何变量名。

        如果您选择“i”,大多数其他(初学者)程序员可能会认为“哦,我的意思是索引”。这是错误的。

        如果您使用一个参数而不是三个参数,我会选择“el”来表示元素,或者如果您的数组包含苏打水的味道,我会选择“味道”。

        【讨论】:

          【解决方案6】:

          那是 ES5 表示法,也许如果你在 ES6 表示法中看到它,你就会明白为什么“i”是必须的:

          numbers.filter(i => i > 2);
          

          必须始终使用变量来引用您在每次迭代中处理的数组项(在本例中为“i”)。它必须作为参数传递给函数的入口点(在 ES6 中,在箭头之前)。

          【讨论】:

            猜你喜欢
            • 2020-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 1970-01-01
            • 2021-08-26
            相关资源
            最近更新 更多