如何阻止javascript过滤器函数迭代



代码如下

sortedProducts = sortedProducts.filter((product, i) => {
if (i + 1 > limit) {
return false;
}
return product.name.startsWith(search);
});

我想在index = limit处停止迭代所以我可以优化我的函数,因为不需要有index > limit的项目在这种情况下是否有类似于break这个词的东西?提前感谢

Array#filter在每个项目上运行回调:

函数是一个谓词,用于测试数组的每个元素。返回一个值,该值强制为true以保留该元素,否则强制为false。

因此,您可以先使用Array#slice:

获取子数组,而不是不必要地遍历其余项。
sortedProducts = sortedProducts
.slice(0, limit)
.filter(product => product.name.startsWith(search));

另一种真正"打破"的方式从循环:

const arr = [];
for(let i = 0; i < sortedProducts.length; i++) {
if (i + 1 > limit) {
break;
}
if(sortedProducts[i].name.startsWith(search)) {
arr.push(sortedProducts[i]);
}
}

如果你想使用Array.prototype的方法和快捷方式,你可以使用Array.prototype.some

const collection = [];
sortedProducts
.some(function(product,i){
if(this.length >= limit){
return 1;
}
if(product.name.startsWith(search)){
this.push(product)
}
},collection)

我将一个数组作为this传递给some方法。您也可以使用map,forEach,every等来执行此操作。

代替this.length,你可以附加一个任意属性,如this._iteration,并增加它等。另一个选择是像@Majed建议的那样对数组进行切片,或者只是使用旧的循环并从中中断。

最有效的方法是将数组作为可迭代对象处理。这样,在应用任意数量的操作时,始终只迭代一次值。

下面的例子是基于iterops库的:

import {pipe, filter, take} from 'iter-ops';
// define your sortedProducts, + search + limit here;
const result = pipe(
sortedProducts,
filter(product => product.name.startsWith(search)),
take(limit)
);
console.log([...result]); // prints your found products

相关内容

  • 没有找到相关文章

最新更新