【问题标题】:How does the function in this array filter work?这个数组过滤器中的函数是如何工作的?
【发布时间】:2015-12-22 23:34:21
【问题描述】:

我正在做一个初学者练习,求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);
    }
)

它甚至对它们进行排序。我不知道它是如何工作的。我浏览了this doc,但实际上并没有类似的东西。

我什至不知道您可以使用比较运算符返回一些东西。我认为它可能是 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);

【问题讨论】:

  • 为什么我在 Chrome 控制台中尝试时得到[23, 9, 14, 2, 28, 19, 3, 15, 25, 4] 而不是您的排序结果。我认为我的结果对你来说很有意义。
  • @JasmineOT 哦,奇怪。不知何故,即使我将排序方法分配给了一个变量,它也会继续存在。我对此很陌生,所以请原谅我。用完整的代码编辑了我的帖子。
  • 这很清楚。你自己做了排序。并且在你对数组使用sort( ) 之后,数组会保留新的排序数组。
  • 也许把你的回调变量改成比i, j, k更有意义的变量。
  • @JasmineOT 好吧,我只注意到排序后有重复,所以就是这样

标签: javascript arrays function methods


【解决方案1】:

过滤函数必须返回“真”或“假”。首先仔细阅读这个Array.prototype.filter

然后你可以向自己解释你的过滤器功能是如何工作的

【讨论】:

  • 这解释得更好。我去了微软,因为我认为那是特定于原型的。谢谢!
【解决方案2】:

filter 函数只保留函数返回 true 或真值的元素。

在你的情况下,

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

这里,

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

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

所以,基本上它为数组中的第一个值返回true,如果数组包含不止一次的值(重复值)它返回@987654332 @ 并且该元素不包含在过滤后的数组中。


为变量赋予有意义的名称将使您只需查看代码即可轻松理解代码

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时,它表示循环时的相应实体。

【讨论】:

  • 给了你答案,因为这更具体/回答了我的问题。但是为输入数组使用参数的原因是什么呢?因为它首先是数组的方法
  • @delz 过滤器函数内部的上下文不是调用它的数组,而是window
  • 您的编辑很有帮助,但我不完全了解它是如何过滤的。为什么return 1 === numbers.indexOf(9)(前 9 个)为真,而 return 12 === numbers.indexOf(9)(后 9 个)不是?它是否只是强制每个元素就其性质而言是唯一的,即。 12 不能是 9 的索引,因为我们已经知道 1 是?
  • @delz 因为indexOf 总是返回找到传递元素的第一个索引
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多