Javascript JS中[]过滤器的倒数?
我意识到我可以做到:Javascript JS中[]过滤器的倒数?,javascript,arrays,filter,Javascript,Arrays,Filter,我意识到我可以做到: arr = arr.filter(function(n){ return !filterFunc(n); }); 但是有没有什么方法可以在不使用anon函数包装过滤器的情况下反转过滤器呢 它看起来很麻烦。filter返回在计算中返回true的元素。如果要反转,请在测试每个元素的函数中反转逻辑 然后,您可以简单地使此函数按如下方式工作: arr=arr.filter(filterFunc)您可以向数组对象添加自己的函数或添加静态/原型方法 代码 数组多填充方法 /** *n
arr = arr.filter(function(n){ return !filterFunc(n); });
但是有没有什么方法可以在不使用anon函数包装过滤器的情况下反转过滤器呢
它看起来很麻烦。
filter
返回在计算中返回true
的元素。如果要反转,请在测试每个元素的函数中反转逻辑
然后,您可以简单地使此函数按如下方式工作:
arr=arr.filter(filterFunc)代码>您可以向数组对象添加自己的函数或添加静态/原型方法
代码
数组多填充方法
/**
*not()方法创建一个包含所有失败元素的新数组
*由提供的函数实现的测试。
*
*语法
*arr.not(回调[,thisArg])
*
*@param回调
*函数测试数组的每个元素。援引
*参数(元素、索引、数组)。归真保存
*元素,否则为false。
*@param thisArg
*可选。值,在执行回调时用作此值。
*@return返回一个包含所有失败项目的新数组
*测试。
*/
Array.prototype.not=函数(回调){
返回此.filter(函数(){
return!callback.apply(这个,参数);
});
};
/**
*在数组上调用Array.prototype.not的静态方法
*帕拉马特。
*
*@see Array.prototype.not
*/
Array.not=函数(数组,回调){
返回数组!=null?数组。非(回调):[];
};
自定义函数
函数取消筛选(数组、回调){
返回array.filter(函数(){
return!callback.apply(这个,参数);
});
}
这比polyfill更安全,但使用起来并不优雅
unfilter(items,isFruit)
vsitems.not(isFruit)
例子
//================================================================
//聚填料
// ================================================================
Array.prototype.not=函数(回调){
返回此.filter(函数(){
return!callback.apply(这个,参数);
});
};
// ================================================================
//主要
// ================================================================
可变项目=[{
名称:'苹果',
是的
}, {
名字:'胡萝卜',
isFruit:错
}, {
名字:“甜瓜”,
是的
}, {
名字:“土豆”,
isFruit:错
}];
var isFruit=功能(项目、索引){
返回项目!=null&&item.isFruit;
};
var getName=函数(项、索引){
返回项!=null?项。名称:'?';
};
document.body.innerHTML=items.not(isFruit).map(getName.join(',')代码>让我们举个例子
var-cars=[{
卡纳梅:“印度”,
品牌:“塔塔”
},
{
卡纳姆:“协议”,
品牌:“丰田”
},
{
卡纳姆:“文托”,
品牌:“大众”
},
{
卡纳姆:“马球”,
品牌:“大众”
},
{
卡纳姆:“曼扎”,
品牌:“塔塔”
},
{
卡纳姆:“敏捷”,
品牌:“雪佛兰”
},
];
var isTata=功能(汽车){
还车。品牌==“塔塔”
}
var fiteredCars=cars.filter(isTata);//塔塔品牌的retuns对象
console.log(fiteredCars)
您可以使用箭头功能:
const a = someArr.filter(someFilter);
const a = someArr.filter(e => !someFilter(e));
看看lodash的功能。这正是他评论中提到的
用法:
arr = arr.filter(_.negate(filterFunc));
提供一个拒绝函数,其作用与过滤器完全相反
arr = _.reject(arr, filterFunc);
我对任何一个直接的答案都不满意,实际上我最终使用了更新的JS特性
arr.filter(() => ! filterfunc(...arguments));
与大多数其他方法相比,这一方法不必在任何时候使用重新指定上下文(This
),并使用上的相应地传递所有参数
它也相当简洁,尽管我更喜欢在filter函数上使用一个invert标志,或者使用一个单独的函数
这个问题可能有点老套,但它仍然是相关的。据我所知,没有。但是你可以做一个:Array.prototype.unfilter=function(cb){返回这个.filter(function(a,b,c){返回!cb(a,b,c);}代码>我最好以更函数化的方式函数not(func){return function(){return!func.apply(this,arguments);};}
。用法arr=arr.filter(非(标准))代码>。您的代码没有抓住要点。您应该修改filterFunc以返回与它相反的结果,而不是在函数调用中返回函数调用。这只是因为你做的很麻烦。因此,乍一看,整个问题都有点令人困惑。直到我看了第三个答案,我才意识到发生了什么。@kyle baker也许你对OP的示例代码感到困惑,但你似乎认为他们只编写一个过滤函数一次是错误的,然后用它来获取匹配该过滤器的集和不匹配的集。仅仅因为Javascript没有在语言级别实现与filter
相反的功能,并不意味着每个人都应该编写两个过滤函数来将数组分成两组。正如下面的答案所示,OP可以通过Lodash或arrow函数得到他们想要的东西,而无需重写filterFunc
。糟糕的做法和超高压;内置的Array.prototype.filter()
函数被设计为以本机方式处理其自身的逆运算——这就是它接受函数作为参数的原因。@KyleBaker,“设计为以本机方式处理其自身的逆运算”——您想解释一下如何使用“设计”和“本机”这两个词吗?编写过滤函数的静态逆函数是浪费时间的,因为您可以轻松地使用合成。例如,xs.filter(comp(not)(f))
其中not=x=>!x
和comp=f=>g=>x=>f(g(x))
–我不认为mrpolywhill的方法是如何“严厉”的,特别是考虑到它是使用Array.prototype.filter实现的<