Javascript 如何限制array.filter的10个结果?

Javascript 如何限制array.filter的10个结果?,javascript,Javascript,我有一个大数组,我想做一个自动完成搜索,但我只想显示10个结果,所以在找到10个结果时停止遍历数组。我已作出以下声明: let items = array.filter(r => r.indexOf(term)!=-1); console.log(items.length) // lots of items, need to be limited to 10 它可以工作,但我不知道如何停止数组。在它达到所需限制时进行筛选。 var数据=[“1”、“2”、“3”、“4”、“5”、“6”、“

我有一个大数组,我想做一个自动完成搜索,但我只想显示10个结果,所以在找到10个结果时停止遍历数组。我已作出以下声明:

let items = array.filter(r => r.indexOf(term)!=-1);
console.log(items.length) // lots of items, need to be limited to 10
它可以工作,但我不知道如何停止
数组。在它达到所需限制时进行筛选。

var数据=[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”、“12”、“13”、“14”]

var limited=data.filter((val,i)=>i您可以移交一个计数器并忽略任何其他值进行筛选

const
过滤器=v=>v%2,
过滤器最大=(fn,c)=>x=>c&&fn(x)&&c--,
最大值=3,
数组=[1,2,3,4,5,6,7,8,9,10],
结果=数组.filter(filterMax(filter,max));

console.log(result);
您只需简单地添加
.Slice(0,不需要元素)
发现前两个是偶数

[1,2,3,4,5,6,7,8,9,10].filter((e)=> e%2==0).slice(0,2)

回答:
let items=array.filter(r=>r.indexOf(term)!=-1)。slice(0,10);
您可以在
数组上定义自定义方法。prototype
将包含2个参数。结果数组将包含回调和max元素

下面的代码从数组中获取前3个奇数

函数filto(回调,最大值){
让len=this.length
设res=[];
设i=0;
while(res.lengthconsole.log(arr.filto(x=>x%2,3));//前三个奇数
基本上你可以使用一个生成器函数,它可以通过一个自制的限制来停止,就像下面的函数一样

函数*过滤器(数组、条件、最大大小){
如果(!maxSize | | maxSize>array.length){
maxSize=array.length;
}
让计数=0;
设i=0;
while(countconsole.log(Array.from(filter(Array,i=>i%2==0,2));//expect 2&4
您可以使用另一个变量跟踪到目前为止有多少项与条件匹配,并在达到限制后始终返回false。以下是一个示例:

const arr=[1,0,2,0,3,0,4,5,6,7,8,9,10,11,12,13,14];
常量筛选=arr.filter(函数(项){
如果(this.count<10&&item>0){
这个.count++;
返回true;
}
返回false;
},{count:0});

console.log(过滤);
您不能从
数组.prototype.filter
方法中
中断
。它将在每个元素上循环。您可以使用一个简单的
for
循环,并在找到10项时中断

const items = []
for (const value of array) {
  if (value.includes(term))
    items.push(value)
  if (items.length === 10)
    break;
}
只是为了好玩:

编辑:要澄清此代码,将选择列表中的前10个偶数

let数组=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30];
常量结果=数组。减少((温度,值)=>{
如果(值%2==0&&temp.length,这对于这类事情很方便

下面是我如何找到以“1”开头的前100个数字

const{blinq,range}=window.blinq;
//创建要搜索的字符串的大数组
常数arrtobesearch=范围(010000)
.select(x=>`${x}`)
.toArray()
const query=blinq(arrtobesearch)
.其中(x=>x.startsWith(“1”))
.takeWhile((x,i)=>i<100)
const result=[…query]//在这一行实现之前,不进行任何计算
console.log(结果)

我知道有点晚了,但这是为新来者准备的

//我们将创建一个包含两个参数的函数
//第一个参数是要从中筛选的原始数组
//第二个参数是希望筛选器返回的结果数
常量限制数组=(原始数组,限制)=>{
设newArray=[];
对于(原始阵列的let项){
如果(newArray.length>=限制)中断;
//你的代码在这里
//在我的情况下,我将把它推入阵列
newArray.push(项目)
}
返回新数组;
};
//---------------->忽略v{
console.log(项目)
})

项。切片(0,10)
但它在遍历所有原始数组后进行切片。
[1,2,3]。筛选((r,i)=>i<2)
将是一种效率极低的方法,但数组中的所有项目都将被处理。否则,只需滚动你自己的项目。类似的问题如下:@Raz是的,你是对的,所以我添加了一个带有生成器函数的答案:)聪明。我一直忘记
中的第二个参数。filter
(和
.map
,等等).@VLAZ是的,它在那里,但我不经常使用它,因为它需要一个普通函数,它不能与箭头函数一起使用。@当您将第二个参数传递给
.filter
-在本例中为
{count:0}时,请花钱
,它将作为
用于作为第一个参数传递的回调。回答中提到它可能是个好主意-它很少被使用,所以有点模糊。我以前从未见过。很有趣,但实际上
计数
是不必要的,因为
过滤器
会将计数作为第一个参数传递给您它回调的第二个参数。
arr.filter(function(item,index){…
@spender它不是计数,而是索引。如果你的条件有
index<10
,那么你只会过滤第一个
10
元素。这是我想要的解决方案。现在,你可以从(someIterable)中简写
Array
有一个扩展:
[…someIterable]
@spender这是一个很好的观点,我不介意速记语法,但我喜欢明确:)使用生成器的好处是什么?(很抱歉格式化)
函数过滤器2(数组,条件,最大大小){if(!maxSize | maxSize>array.length)maxSize=array.length