如何停止javascript过滤函数的迭代

iovurdzv  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(151)

我的代码如下

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

我想停止在index = limit处的迭代,这样我就可以优化我的函数,因为不需要包含index > limit的项,在本例中是否有类似于单词break的内容?

yws3nbqq

yws3nbqq1#

Array#filter对每个项目运行回调:
函数是一个 predicate ,用于测试数组的每个元素。返回一个值,该值强制为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]);
  }
}
9wbgstp7

9wbgstp72#

如果希望使用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)

我传递一个数组作为thissome方法。你也可以用mapforEachevery等等来做。
除了this.length,您还可以附加一个任意属性,如this._iteration,并递增该属性。其他选项是像@Majed建议的那样对数组进行切片,或者只是使用良好的旧循环并从中中断。

rqqzpn5f

rqqzpn5f3#

最有效的方法是将数组作为可迭代对象来处理,这样你就可以只迭代一次值,同时应用你想要的任意数量的操作。
以下示例基于iter-ops库:

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

相关问题