如何否定 Array.protype.filter 函数



我正在使用 Array.prototype.filter(( 方法将数组过滤成 2 组元素,然后使用 Knockout 遍历这 2 组元素,尽管我相信这个问题与 JS 有关。我想把真元素做成A集,做假的,做B集。因此,对于 falsy,我尝试否定该函数,但发生以下错误。我可以创建第二种方法来执行否定,但是我对这个解决方案感兴趣。谢谢。

Array.prototype.filter:参数不是函数对象

.HTML:

<!-- ko foreach: Items.filter(IsSetA) -->
<h1>Is Set A</h1>
<!-- /ko -->
<!-- ko foreach: Items.filter(!IsSetA) -->
<h1>Is Set B</h1>
<!-- /ko -->

.JS:

function IsSetA(item) {
return item.category === 'A';
}

Array.prototype.filter()要求您传递一个函数,它将在每个项目上执行。IsSetA本身是有效的,因为它是一个函数,但是用!运算符将其取反会将其转换为布尔值,这根本不是filter接受的。

或者,您可以创建帮助程序函数并在模板中使用它们:

function IsSetATruthy(item) {
return IsSetA(item);
}
function IsSetAFalsy(item) {
return !IsSetA(item);
}

或编写与内联函数相同的内容:

<!-- ko foreach: Items.filter(function(item) { return IsSetA(item); }) -->
<h1>Is Set A</h1>
<!-- /ko -->
<!-- ko foreach: Items.filter(function(item) { return !IsSetA(item); }) -->
<h1>Is Set B</h1>
<!-- /ko -->

或者使用箭头函数(如果目标支持(:

<!-- ko foreach: Items.filter(item => IsSetA(item)) -->
<h1>Is Set A</h1>
<!-- /ko -->
<!-- ko foreach: Items.filter(item => !IsSetA(item)) -->
<h1>Is Set B</h1>
<!-- /ko -->

您正在尝试否定函数引用。您尝试做的是否定函数的结果。正情况有效(过滤器需要函数引用(,但负情况不会,因此手动否定结果:

<!-- ko foreach: Items.filter(IsSetA) -->
<h1>Is Set A</h1>
<!-- /ko -->
<!-- ko foreach: Items.filter(function(val){ return !IsSetA(val); }) -->
<h1>Is Set B</h1>
<!-- /ko -->

最新更新