【问题标题】:Is there a C#-like lambda syntax in JavaScript?JavaScript 中是否有类似 C# 的 lambda 语法?
【发布时间】:2011-08-25 12:35:23
【问题描述】:

是否有 JavaScript 框架或后处理器支持像 C# 中的 lambda 语法?

CoffeeScript 中的函数定义看起来像 lambda,但我没有仔细研究它们。

谁能告诉我,我可以在 JavaScript 中使用 lambda 语法吗?

【问题讨论】:

  • 什么意思? Javascript 有内置的 lambdas。
  • 是的,JavaScript 中有“lambda 表达式”,但它们被称为 箭头函数表达式See this link for more details
  • 这很有趣,因为实际上是 c# 中的 lambdas,现在 Java 实际上是从 javascript 中获得灵感的,而不是相反
  • @slaphappy 你是说function expressions 当你说vanilla JavaScript 有内置的lambdas 吗?您可以将函数表达式用作 lambda 表达式或其他内容。

标签: javascript


【解决方案1】:

ECMAscript 6 中包含语法相似的 Lambda 函数,它们被称为“箭头函数”。一个例子:

["duck", "cat", "goat"].filter(el => el.length > 3); 返回["duck", "goat"]

FirefoxChrome 的最新版本目前支持。

要在针对旧版浏览器的 JavaScript 中使用这种语法,有一些工具可以将 ES 6 编译为更广泛支持的版本 - 例如工具 BabelTraceur

【讨论】:

【解决方案2】:

你可以使用打字稿(www.typescriptlang.org/):

function (d, i) {
    return "translate(" + d.x + "," + d.y + ")";
}

会变成

(d, i) =>  "translate(" + d.x + "," + d.y + ")"  

还有更多很酷的东西,比如输入:...如果你喜欢的话

【讨论】:

【解决方案3】:

我开始为 jQuery 创建一个扩展器,它完全可以满足您的要求。 JS-Lambda

例如在 C# 中:

  coll.TakeWhile(x => x.index < 3);

看起来像:

 $(coll).TakeWhile("x => x.index < 3");

【讨论】:

  • 我知道这个库不是一个功能齐全的库,我永远不会在项目中使用它,但这只是一个有趣的项目,让 lambda 表达式在 JavaScript 中工作。
  • 虽然没有 ES6 支持,它不会给你 lambda 的东西,lodash 或下划线可能是你的库试图实现的更完整/稳定的版本。至少可能值得从中汲取灵感。
【解决方案4】:

Javascript 有非常好的匿名函数,允许你在任何你需要的地方创建 lambdas 作为一个函数,但是实现带有一些重复的单词和范围创建:

function(name){
     return "Hello, " + name;
}

感谢 EcmaScript 2015 lambda 表达式现在可用于 javaScript,语法更简单,如 Arrow Function

(name) => "Hello, " + name

【讨论】:

    【解决方案5】:

    FIDDLE: https://jsfiddle.net/vktawbzg/

    NPM: https://www.npmjs.com/package/linqscript

    GITHUB: https://github.com/sevensc/linqscript

    使用 Typescript 我创建了一个扩展 Array&lt;T&gt; 的类 List&lt;T&gt;

    用法:

    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

    【讨论】:

    • 嗨,我正在尝试做同样的事情,并专门针对 GroupBy 方法。你有链接或任何好的资源吗?
    • 嗨,当然可以,看看我的 github 仓库:github.com/sevensc/linqscript 以获得一些灵感。
    【解决方案6】:

    正是马修·麦克维!!

    我也想贡献,看这个例子

    "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] } ));

    https://jsfiddle.net/angelfragap/0b5epjw3/29/

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      相关资源
      最近更新 更多