// Return all elements of an array that pass a truth test.
_.filter = function(collection, test) {
var result = []; //make a result variable
//iterate over the collection array using _.each
_.each(collection, function(value) {
//if conditions for test(element) = positive
if (test(value)) {
//push element into result
result.push(value);
}
});
return result;
};
嗨,我正在重写 Underscore JS 库中的 _.filter
和 _.reject
函数。我仍然对回调函数有点困惑,特别是当同一个函数中有这么多回调函数时。我需要澄清一下我的想法和逻辑;特别是关于._reject
。我正在重用我的 _.filter
函数并将其实现在我的 _.reject
函数中。
_.reject = function(collection, test) {
return _.filter(collection, function(value) {
return !test(value);
})
};
当我将函数(值)作为过滤器的参数并定义它时;是用该函数回调替换我的测试值吗?特别是在这一行——
if (test(value)) {...
在这种情况下会被我的回调替换 if(function(value) {return !test(value)})
另外,如果我在 _.reject
函数中省略 _.filter
的 return
命令;我只是返回函数本身吗?抱歉 - 我知道这有点奇怪,因为据我所知,我的代码可以工作,但实际上更多的是尝试尝试然后真正从逻辑上理解它。我只是对从拒绝函数调用过滤器中的回调函数时发生的情况感到非常困惑
最佳答案
在 JavaScript 中,一切都是对象——包括函数。当您编写这样的函数表达式(如它们的名称)时:
const foo = function() {
console.log('This function prints this message!');
};
foo
现在包含对打印消息的函数的引用。我们可以这样调用它:
foo();
...运行代码并打印消息。您可以像任何其他值一样传递 foo
,包括作为其他函数的参数。可以将其想象为保存一组执行某操作的指令:您告诉计算机“foo
包含运行时打印一条消息的代码。”
在您的示例中,作为第二个参数传递给 _.filter
的函数表达式是一个对象:
function(value) {
return !test(value);
}
您的意思是“将此函数(它接受一个值,用它调用 test
,否定结果,然后将其返回)传递给我的 _.filter
函数”。 _.filter
知道调用那个函数来过滤掉值。
编程充满了这些类型的模式:目标不是看看到底发生了什么,而是理解 _.filter
接受第二个参数,该参数是一个函数,表示“如果你给我一个值,我会告诉你是否保留它。”在您的代码中,您向其传递一个函数来执行此操作,但它还调用您的用户传入的另一个函数 (test
)。函数调用链可能很长:数百或数千个函数调用其他函数。
就您的情况而言,您的代码似乎是正确的。 _.filter
表示“给我一个数据数组和一个函数。我将为数组中的每个值调用该函数,然后它将返回我是否保留它。”您正在创建一个函数,该函数表示“给我一个数据数组和一个函数。我将为数组中的每个值调用该函数,它会返回我是否不保留它”。为此,您只需反转 _.filter
想知道的内容:您想知道是否消除记录,而不是是否保留记录。
因此,您的代码将用户的数组和函数提供给 _.filter
就像它想要的那样。使用数组的每个元素调用该函数。 _.filter
想知道是否保留该项目。您将使用 _.filter
询问您的项目来调用 test
。但是,如果用户的函数返回 true
,我们想要消除该元素,而不是保留它,因此我们否定它(使用 !
)并且返回值。然后您将返回 _.filter
的结果。
澄清一下return
:return
关键字告诉调用您函数的函数您想要“返回”什么。因此,当您返回!test(value)
时,您就是在告诉无论调用您的函数!test(value)
的值(在此情况下,即 _.filter
)。如果您没有使用return
,您就不会向调用函数的代码返回任何内容。如果用户想知道元素被拒绝后数组是什么样子,并且您的函数没有返回
任何内容,那么您的函数就不是很有用!
关于javascript - 在 Underscore JS 中编写我的 _.reject 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60538249/