我正在做初学者练习,找到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
答案 0 :(得分:2)
filter
函数仅保留函数返回true
或truthy值的元素。
在你的情况下,
return j === k.indexOf(i);
在这里,
i
是循环中的当前元素。j
是循环中的当前索引k
是输入数组 k.indexOf(i)
将返回数组中元素的第一个索引。如果循环中当前元素的索引(即j
)与数组中的第一个索引相同,则它将返回true
和false
。
因此,基本上它返回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
然后您可以自己解释过滤功能的工作原理