代码改变世界

每周优秀代码赏析系列【一】----LINQ In Javascript

  【当耐特】  阅读(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); });
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
点击右上角即可分享
微信分享提示