这段代码使用[] .filter.call做什么?

时间:2016-06-25 21:58:17

标签: javascript arrays

我正在学习javascript并尝试编写对列表进行排序的代码,如果符合某些条件,则删除元素。

我发现这个片段看起来很有前途,但不知道它是如何工作的,所以我可以根据自己的需要调整它:

list = document.getElementById("raffles-list").children; // Get a list of all open raffles on page
list = [].filter.call(list, function(j) {
    if (j.getAttribute("style") === "") {
        return true;
    } else {
        return false;
    }
});

你们可以通过解释这个代码块的作用来帮助我学习吗?

3 个答案:

答案 0 :(得分:4)

让所有孩子参与"抽奖活动列表"元素,然后返回包含空"样式"的过滤列表。属性。

第一行非常不言而喻 - 它只是从id"抽奖列表"中检索元素中的孩子。

第二行稍微复杂一点;它利用了两件事:那个[],一个空数组,实际上只是一个有各种方法/属性的对象,并且等号右边的逻辑需要是在" list"之前评估得到新的价值。

  1. 使用空白数组以调用"过滤器"方法
  2. 告诉过滤器使用 list 作为要过滤的数组,并使用 function(j)进行过滤,其中j为正在测试的列表中的项目
  3. 如果项目的样式属性为空,即未应用样式,则返回true。
  4. 编辑: 根据OP评论, []。过滤器是一个原型,所以本质上是一个具有各种属性的对象,就像其他所有东西一样。在这种情况下,过滤器是一种方法 - 请参阅 here 。通常,您只需指定执行测试的匿名函数/方法,但是此处作者使用 .call 来指定要执行测试的任意对象。它似乎已经内置到标准的过滤器方法中,因此我不知道他们为什么这样做。

答案 1 :(得分:0)

类似对象的数组是一些javascript对象,它们类似于数组但有差异,例如它们没有实现数组原型。如果你想通过它们获得数组的好处(例如像元素的问题过滤器子元素),你可以这样做:

Array.prototype.functionName.call(arrayLikeObject, [arg1, [arg2 ...]]);

这里有问题的数组就像是html元素集合;它需要没有任何造型的物品。

答案 2 :(得分:0)

  1. list被分配了集合元素,这些元素是raffles-list元素的子元素
  2. 然后通过过滤其元素重新分配
  3. list,如下所示
    1. filter空数组calllist引用参数call和回调函数。 this的形式参数是listj)和可选的其他对象(在这种情况下是回调函数)
    2. 回调函数接收形式参数style,并为每个元素
    3. 调用
    4. 如果list属性的元素值为空,则元素将保留在数组中。否则它会被丢弃。
  4. 最后style应包含所有不具有public bool ReturnSomething(){ var test = true; var test2 = MyOtherFunction(test); var test3 = false; } 属性值的元素