如何否定Array.protype.filter函数

时间:2017-07-03 14:20:40

标签: javascript knockout.js

我使用Array.prototype.filter()方法将数组过滤为2组元素,然后使用Knockout迭代这2组,不过我相信这个问题与JS有关。我想采取truthy元素并使集合A和falsy并使集合B.因此,对于falsy我试图否定函数,但发生以下错误。我可以创建第二种方法来执行否定,但我对此解决方案感兴趣。感谢。

  

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

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';
}

2 个答案:

答案 0 :(得分:4)

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 -->

或如果您的目标supports使用箭头功能:

<!-- 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 -->

答案 1 :(得分:3)

您正在尝试否定函数引用。你试图做的是否定函数的结果。肯定的情况有效(过滤器需要一个函数引用),但负数不会,所以手动否定结果:

<!-- 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 -->