Javascript 带限流的Lodash过滤器

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 <

是否有方法从符合条件的数组中筛选前n个元素

我知道你可以
过滤
,然后调用
获取
,但这不就是通过整个列表,而不是在达到限制后退出吗

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