该数组过滤器中的函数如何工作?

时间:2015-09-25 07:31:22

标签: javascript arrays function methods

我正在做初学者练习,找到var numbers = [23,9,14,2,28,19,3,15,9,25,2,4,9]的平均值/中位数/模式/范围。平均值很简单,但我必须得到中位数的唯一数字。我发现了一些完美适用的东西:

var numbersUnique = numbers.filter(
    function(i, j, k) {
        return j === k.indexOf(i);
    }
)

它甚至对它们进行了分类。我不知道它是如何工作的。我撇去了mysql,但实际上并没有什么相似之处。

我甚至不知道你可以用比较运算符返回一些东西。我认为它可能是if (j === k.indexOf(i)) { return j; }的简写,但是记录[3, 4, 9, 14, 15, 19, 23, 25, 28]而不是原始[2, 3, 4, 9, 14, 15, 19, 23, 25, 28] var numbers = [23, 9, 14, 2, 28, 19, 3, 15, 9, 25, 2, 4, 9]; // Mean var numbersTotal = 0; for (i = 0; i < numbers.length; i++) { numbersTotal += numbers[i]; } var numbersMean = (numbersTotal / numbers.length); console.log("The mean is " + numbersMean); // Median var numbersSorted = numbers.sort(function (a, b) { return a - b; }) var numbersUnique = numbers.filter(function (i, j, k) { return j === k.indexOf(i); }) console.log(numbersUnique);

究竟做什么功能?

完整代码

original_post

2 个答案:

答案 0 :(得分:2)

filter函数仅保留函数返回true或truthy值的元素。

在你的情况下,

return j === k.indexOf(i);

在这里,

  • i是循环中的当前元素。
  • j是循环中的当前索引
  • k是输入数组

k.indexOf(i)将返回数组中元素的第一个索引。如果循环中当前元素的索引(即j)与数组中的第一个索引相同,则它将返回truefalse

因此,基本上它返回true表示数组中的 first 值,如果数组包含多次值(重复值),则返回false并且元素不包含在已过滤的数组中。

为变量赋予有意义的名称,只需查看它就可以轻松理解代码

var numbersUnique = numbers.filter(
    function (element, index, array) {
    //        ^^^^^^^                    The current element in the array
    //                 ^^^^^             The index of the current element in array
    //                        ^^^^^      Original Array

    return index === array.indexOf(element);
});

注意:当我在上面的解释中使用current时,它表示循环时各自的实体。

答案 1 :(得分:-1)

过滤功能必须返回'true'或'false'。首先要仔细阅读Array.prototype.filter

然后您可以自己解释过滤功能的工作原理