代码如下
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