如何否定 Array.protype.filter 函数

Gil*_*gan 1 javascript knockout.js

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

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 -->
Run Code Online (Sandbox Code Playgroud)

JS:

function IsSetA(item) {
    return item.category === 'A';
}
Run Code Online (Sandbox Code Playgroud)

skr*_*orn 5

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

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

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

function IsSetAFalsy(item) {
   return !IsSetA(item);
}
Run Code Online (Sandbox Code Playgroud)

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

<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)

或者如果您的目标支持箭头函数,则使用箭头函数:

<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)


Jam*_*iec 5

您正在尝试否定函数引用。你试图做的是否定函数结果。正例有效(过滤器需要函数引用),但负例无效,因此手动否定结果:

<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)