Javascript 带限流的Lodash过滤器
是否有方法从符合条件的数组中筛选前n个元素 我知道你可以Javascript 带限流的Lodash过滤器,javascript,lodash,Javascript,Lodash,是否有方法从符合条件的数组中筛选前n个元素 我知道你可以过滤,然后调用获取,但这不就是通过整个列表,而不是在达到限制后退出吗 _(books).filter(function(book) {return book.pages > 10}).take(5).value(); 您的解决方案几乎适用于所有情况,除非您必须处理大量数据。无法想出更有效的lodash解决方案,但这就足够了: var take = 5; var result = []; for(var i = 0; i <
过滤
,然后调用获取
,但这不就是通过整个列表,而不是在达到限制后退出吗
_(books).filter(function(book) {return book.pages > 10}).take(5).value();
您的解决方案几乎适用于所有情况,除非您必须处理大量数据。无法想出更有效的lodash解决方案,但这就足够了:
var take = 5;
var result = [];
for(var i = 0; i < books.length; i++) {
var book = books[i];
if(book.pages > 10) {
result.push(book);
--take;
}
if(take === 0) {
break;
}
}
var-take=5;
var结果=[];
for(var i=0;i10){
结果:推(书);
--采取;
}
如果(取=0){
打破
}
}
另一种方法
var limit = 5,
result = [];
_.forEach(books, function(book) {
if (limit--) {
return false;
} else {
if (book.pages > 10) {
result.push(book);
}
}
});
据我所知,只有一个lodash函数允许您提前终止,那就是
result=(书籍)。转换(函数(结果,书籍){
book.pages>10&结果推送(book);
返回结果。长度<5;
}).value();
document.write(JSON.stringify(result))代码>
var账簿=[
{标题:“a”,第8页},
{标题:“b”,第10页},
{标题:“c”,第12页},
{标题:“d”,第14页},
{标题:“e”,第16页},
{标题:“f”,第5页},
{标题:“g”,第18页},
{标题:'h',页码:20}
]
如果传递给..forEach()
函数的迭代器函数返回false
,则迭代立即停止
下面的filter
函数说明了如何使用.forEach()
解决您的用例
函数过滤器(书本、最大计数){
var结果=[];
_.forEach(书籍、功能(书籍){
如果(results.length==maxCount){
返回false;
}
如果(book.pages>10){
结果:推(书);
}
});
返回结果;
}
var N=5;
var books=新数组(20);
//为每本书指定一个等于其图书索引的页数。
_.forEach(books,function(v,i){books[i]={pages:i}});
console.log(过滤器(books,N))代码>
您只需设置数组的长度即可
var numbers = [1, 2, 3, 4, 5];
if (numbers.length > 3) {
numbers.length = 3;
}
console.log(numbers); // [1, 2, 3]
console.log(numbers.length); // 3
请参见列表中的ISU的用途是什么?如果要从1000条记录中提取5条,在尝试优化阵列过滤之前,可能应该尝试限制返回的数据。或者,如果这很重要,请包装您自己的迭代器,并在满足条件时将其拆下。@VtoCorleone您有包装您自己的迭代器的示例吗?复制递减模式,因为它更易于阅读,关于取多少+1:)您应该添加一个答案的引用,从中“复制”此模式。此外,解释代码如何帮助用户几乎总是一个好主意。。。。不知道你在说什么。但你在另一个答案的评论中已经说过,你复制了它。在“按SA抄送”许可证下,您必须向其他用户提供归属。但不管怎样,露尔兹。我很乐意帮忙。我没有复制任何东西。查看我的编辑历史记录。OP正在寻找一种方法,在达到限制后退出filter()
,以避免昂贵的性能成本。看起来您只是在演示如何在执行了昂贵的操作之后截断数组。
var numbers = [1, 2, 3, 4, 5];
if (numbers.length > 3) {
numbers.length = 3;
}
console.log(numbers); // [1, 2, 3]
console.log(numbers.length); // 3