Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS中[]过滤器的倒数?_Javascript_Arrays_Filter - Fatal编程技术网

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)
vs
items.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实现的<