Javascript 在Typescript中将表达式作为筛选函数的参数传递
考虑以下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
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的答案似乎没有额外的库