是否有支持lambda语法的JavaScript框架或后处理器,如C#?
CoffeeScript中的函数定义看起来像lambda,但我没有仔细研究过它们。
任何人都可以告诉我,我可以在JavaScript中使用lambda语法吗?
答案 0 :(得分:62)
具有类似语法的Lambda函数包含在ECMAscript 6中,它们被称为"箭头函数"。一个例子:
["duck", "cat", "goat"].filter(el => el.length > 3);
返回["duck", "goat"]
要在针对旧版浏览器的JavaScript中使用此语法,可以使用可将ES 6编译为更广泛支持的版本的工具 - 例如工具Babel或Traceur。
答案 1 :(得分:11)
您可以使用typescript(www.typescriptlang.org/):
function (d, i) {
return "translate(" + d.x + "," + d.y + ")";
}
会变成
(d, i) => "translate(" + d.x + "," + d.y + ")"
还有更多很酷的东西,比如输入:......如果你进入那个
那就是答案 2 :(得分:4)
我开始为jQuery创建一个扩展程序,它完全符合您的要求。 JS-Lambda
例如在C#中:
coll.TakeWhile(x => x.index < 3);
看起来像:
$(coll).TakeWhile("x => x.index < 3");
答案 3 :(得分:2)
Javascript具有非常好的匿名函数,允许您在任何需要的地方创建lambdas作为函数,但实现带有一些重复的单词和范围创建:
function(name){
return "Hello, " + name;
}
感谢EcmaScript 2015 lambda expresion现在可用于javaScript,语法更简单为Arrow Function
(name) => "Hello, " + name
答案 4 :(得分:2)
FIDDLE: https://jsfiddle.net/vktawbzg/
NPM: https://www.npmjs.com/package/linqscript
GITHUB: https://github.com/sevensc/linqscript
使用Typescript我创建了一个扩展List<T>
Array<T>
用法:
var list = new List<ListView>();
...
var selected = list.Items.Where(x => x.Selected);
实现:
export class List<T> extends Array<T> {
public Where(callback: (value: T) => boolean, thisArg?: any): List<T> {
try {
const list = new List<T>();
if (this.length <= 0)
return list;
if (typeof callback !== "function")
throw new TypeError(callback + ' is not a function');
for (let i = 0; i < this.length; i++) {
const c = this[i];
if (c === null)
continue;
if (callback.call(thisArg, c))
list.Add(c);
}
return list;
}
catch (ex) {
return new List<T>();
}
}
...
}
修改强> 我创建了一个github回购: https://github.com/sevensc/linqscript
答案 5 :(得分:2)
确切的马修麦克维!
我也想参与这个例子
"use strict";
/* Lambda Helper to print */
function PrintLineForElement(element, index, array){
document.write("a[" + index + "] = " + JSON.stringify(element)+"<br>");
}
/* function to print array */
function Print(a){
a.forEach(PrintLineForElement)
document.write("<br>");
}
/* user model */
class User{
constructor(_id,_name,_age,_job){
this.id = _id;
this.name = _name;
this.age = _age;
this.job = _job;
}
}
/* Provaider users */
class UserService{
constructor(){ }
GetUsers(){
//fake ajax response
let data = [];
data.push(new User(1,"Juan",20,"AM"));
data.push(new User(2,"Antonio",20,"AM"));
data.push(new User(3,"Miguel Angel",30,"Developer"));
data.push(new User(4,"Bea",26,"AM"));
data.push(new User(5,"David",24,"Developer"));
data.push(new User(6,"Angel",24,"Developer"));
data.push(new User(7,"David",34,"TeamLead"));
data.push(new User(8,"Robert",35,"TeamLead"));
data.push(new User(9,"Carlos",35,"TeamLead"));
return data;
}
}
const userService = new UserService();
const users = userService.GetUsers();
//get user order by name
document.write("All users </br>");
Print(users);
//get user order by name
document.write("Order users by name ASC : users.sort((a,b)=>{return a.name > b.name })</br>");
Print(users.sort((a,b)=>{return a.name > b.name; }));
document.write("Order users by name DESC : users.sort((a,b)=>{return a.name < b.name })</br>");
Print(users.sort((a,b)=>{return a.name < b.name; }));
//get user filter by age
document.write("Only users oldest or equal than 25 : users.filter( (w) => {return w.age >= 25;} )</br>");
Print(users.filter( (w) => {return w.age >= 25;} ));
document.write("Only users smallest or equal than 25 : users.filter( (w) => {return w.age <= 25;} )</br>");
Print(users.filter( (w) => {return w.age <= 25;} ));
//GroupBY
/**
* custom group by with Array.prototype.keys
**/
Array.prototype.groupBy = function(f)
{
let groups = [];
this.forEach( function( o )
{
let group = f(o) ;
groups[group] = groups[group] || [];
groups[group].push( o );
});
return Object.keys(groups).map( function( group )
{
return groups[group];
})
}
document.write("Group user by age </br>");
Print(users.groupBy( (w) => {return w.age } ));
document.write("Group user by job </br>");
Print(users.groupBy( (w) => {return w.job } ));
document.write("Group user by job</br>");
Print(users.groupBy( (g) => {return [g.job] } ));
document.write("Group user by job and age then order by name </br>");
Print(users.sort((a,b)=>{return a.job > b.job}).groupBy( (g) => {return [g.job+g.age] } ));
document.write("Group user by job and age then order by name and filter where age < 25 and job equal AM </br>");
Print(users.sort((a,b)=>{return a.job > b.job}).filter((w)=>{ return w.age<25 || w.job == "AM" }).groupBy( (g) => {return [g.job+g.age] } ));