每周优秀代码赏析系列【一】----LINQ In Javascript
2011-10-20 19:49 【当耐特】 阅读(7554) 评论(23) 编辑 收藏 举报一.LINQ简介
LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。
LINQ的出现是基于泛型、扩展方法、Lambda表达式之上,或者说LINQ==Lambda表达式+扩展方法。
二.LINQ的好处
1、无需复杂学习过程即可上手
2、编写更少代码即可创建完整应用。
3、更快开发错误更少的应用程序。
4、无需求助奇怪的编程技巧就可操作数据源。
5、让新开发者开发效率更高。
三.Javascript也可以LINQ一把
没有JSLINQ的日子是痛苦的,没有JSLINQ让我恨不得用XNA去写游戏。
在我用javascript编写一些游戏的时候,总是离不开Array。什么对象、point,都塞到在Array当中。
比如我写火拼俄罗斯方块的时候,判断一行是否堆满,然后进行消除。我是这样写:
1 2 3 4 5 6 7 8 9 10 11 | function clearUp() { for ( var line = 0; line < 21; line++) { var count = 0; for ( var i = 0; i < bottomElement.length; i++) { if (bottomElement[i].y == line) { count++; } } if (count == 12) clearByLineNum(line); } } |
写出这么糟糕的代码,是有历史原因的。好吧,我总是为自己找借口。虽然写出这么糟糕的代码,但是我会惦记着它,因为我知道它一定可以优化,可以更简洁。因为有了linq to javascript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var JSLINQ = function (dataItems) { if (!( this instanceof JSLINQ)) { return new JSLINQ(dataItems); } this .items = dataItems; }; JSLINQ.prototype = { ToArray: function () { return this .items; }, Where: function (clause) { var newArray = []; for ( var index = 0, length = this .items.length; index < length; index++) { if (clause( this .items[index], index)) { newArray[newArray.length] = this .items[index]; } } return new JSLINQ(newArray); } }; |
我就这么无情的,把JSLINQ的心脏部分挖了出来。我们可以这样使用它:
1 2 3 4 5 | var arrayV1 = []; arrayV1.push(1); arrayV1.push(2); arrayV1.push(3); var result1 = JSLINQ(arrayV1).Where( function (item) { return item == 1; }); |
即找出item为1。当然array当中也可以存对象,然后通过jslinq查询:
1 2 3 4 5 6 7 8 9 10 11 | Vector3 = function (x, y, z) { this .x = x || 0; this .y = y || 0; this .z = z || 0; }; var arrayV3 = []; arrayV3.push( new Vector3(1, 1, 1)); arrayV3.push( new Vector3(2, 2, 2)); arrayV3.push( new Vector3(3, 3, 3)); var result2 = JSLINQ(arrayV3).Where( function (item) { return item.x == 1; }); |
即找出Vector3.x为1的。
当然array当中的对象也可以存对象,然后通过jslinq查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var People = [ { ID: 1, FirstName: "Chris" , LastName: "Pearson" , BookIDs: [1001, 1002, 1003] }, { ID: 2, FirstName: "Kate" , LastName: "Johnson" , BookIDs: [2001, 2002, 2003] }, { ID: 3, FirstName: "Josh" , LastName: "Sutherland" , BookIDs: [3001, 3002, 3003] }, { ID: 4, FirstName: "John" , LastName: "Ronald" , BookIDs: [4001, 4002, 4003] }, { ID: 5, FirstName: "Steve" , LastName: "Pinkerton" , BookIDs: [1001, 1002, 1003] }, { ID: 6, FirstName: "Katie" , LastName: "Zimmerman" , BookIDs: [2001, 2002, 2003] }, { ID: 7, FirstName: "Dirk" , LastName: "Anderson" , BookIDs: [3001, 3002, 3003] }, { ID: 8, FirstName: "Chris" , LastName: "Stevenson" , BookIDs: [4001, 4002, 4003] }, { ID: 9, FirstName: "Bernard" , LastName: "Sutherland" , BookIDs: [1001, 2002, 3003] }, { ID: 10, FirstName: "Kate" , LastName: "Pinkerton" , BookIDs: [4001, 3002, 2003] } ]; var result3 = JSLINQ(People). Where( function (item) { return item.ID > 7; }); |
即找出ID大于7的所有people.
四.思考题
如果我想这么查,该怎么办?
1 2 | var result4 = JSLINQ(People). Where( function (item) { return item.BookIDs.Contain(1001); }); |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验