Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Typescript中将表达式作为筛选函数的参数传递_Javascript_Linq_Typescript - Fatal编程技术网

Javascript 在Typescript中将表达式作为筛选函数的参数传递

Javascript 在Typescript中将表达式作为筛选函数的参数传递,javascript,linq,typescript,Javascript,Linq,Typescript,考虑以下Typescript函数: getPeople(): Person[] { return model.people; } 我想用一个嵌入式过滤器来实现它,它将基于一个我想作为参数传递的表达式来工作,大致如下: getPeopleBy(expression): Person[] { return model.people.filter(expression); } var filteredPeople = getPeopleBy(p => p.age < 3

考虑以下Typescript函数:

getPeople(): Person[] {
    return model.people;
}
我想用一个嵌入式过滤器来实现它,它将基于一个我想作为参数传递的表达式来工作,大致如下:

getPeopleBy(expression): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy(p => p.age < 30);
getPeopleBy(expression: Function): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy((p: Person) => { return p.age < 30 });
interface IFilter {
    value: any;
    index?: number;
    Array?: any[];
}

class People {
    private static people: any[];

    static where(expression: (IFilter) => boolean): any[] {
        return this.people.filter(expression);
    }
}


People.where(p => p.age < 30);
getPeopleBy(表达式):Person[]{
返回模型.people.filter(表达式);
}
var filteredPeople=getPeopleBy(p=>p.age<30);
使用Linq和C#,我可以通过接受带有此syntaxis
表达式过滤器的参数来实现这一点

Typescript/Javascript中有类似的东西吗?

忽略(最初的答案-将其留在这里,以便人们了解演变过程):

是的,在C#中你可以做到这一点,但你必须记住,TypeScript附带了一些从C#借用的糖类语法,JavaScript是它自己的动物

为了传递一个表达式,您需要记住lamba表达式只是一个函数,所以在JS中,只有键、值(对象)和函数(简单,对吧?)

因此,要实现您的目标,您的代码应该如下所示:

getPeopleBy(expression): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy(p => p.age < 30);
getPeopleBy(expression: Function): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy((p: Person) => { return p.age < 30 });
interface IFilter {
    value: any;
    index?: number;
    Array?: any[];
}

class People {
    private static people: any[];

    static where(expression: (IFilter) => boolean): any[] {
        return this.people.filter(expression);
    }
}


People.where(p => p.age < 30);
getPeopleBy(表达式:函数):Person[]{
返回模型.people.filter(表达式);
}
var filteredPeople=getPeopleBy((p:Person)=>{return p.age<30});
PS:我还可以建议您将函数名更改为getPeopleWith

如你所见,从人类的角度来看,阅读以下内容更有意义:

getPeopleWith((p: Person) => { return p.age < 30 });
getPeopleWith((p:Person)=>{return p.age<30});
基本上,它可以让30岁以下的人轻松阅读:)

更新:

这将为您提供所需的结果

班级人员{
私人静态人员:任意[]=[];
静态,其中(表达式:(值:any,索引?:数字,数组?:any[])=>布尔值):
任何[]{
返回此.people.filter(表达式);
}
}
人,其中(p=>p.age<30);
更新2:

如果您需要编写FluentAPI或更大的文件,并且厌倦了沿着callbackfn定义拖拽,您还可以执行以下操作:

getPeopleBy(expression): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy(p => p.age < 30);
getPeopleBy(expression: Function): Person[] {
    return model.people.filter(expression);
}

var filteredPeople = getPeopleBy((p: Person) => { return p.age < 30 });
interface IFilter {
    value: any;
    index?: number;
    Array?: any[];
}

class People {
    private static people: any[];

    static where(expression: (IFilter) => boolean): any[] {
        return this.people.filter(expression);
    }
}


People.where(p => p.age < 30);
接口IFilter{
价值:任何;
索引?:编号;
数组?:任意[];
}
阶级人士{
私人静态人:任何[];
静态,其中(表达式:(IFilter)=>布尔值):任意[]{
返回此.people.filter(表达式);
}
}
人,其中(p=>p.age<30);
更新3:

通过使用界面中的模板,您还可以获得良好的智能感知:)

接口人{
年龄:人数;
}
接口滤波器{
值:T;
索引?:编号;
数组?:T[];
}
阶级人士{
私人静态人物:人物[];
静态,其中(表达式:(IFilter:Person)=>布尔值):任意[]{
返回此.people.filter(表达式);
}
}
人,其中(p=>p.age<30);

我希望这一系列更新能帮助您实现目标。

查看linq.js,您可以找到更多信息

使用它,您可以将函数作为参数传递,以用作过滤器


在谷歌上搜索,我发现还有一个TS库(我看到你正在使用TypeScript),你可以找到它。我还没有测试过:)

为什么需要
表达式而不是
Func
?我不想将函数作为参数传递。我想传递过滤器的表达式。我明白了,基本上答案是我做不到。。。因为如果这是解决方案,我宁愿将过滤器从方法中排除,只需执行以下操作:
getPeople().filter(x=>x.age>30)
Brilliant,谢谢。我会看一看,但Vlad的答案似乎没有额外的库