每周優(yōu)秀代碼賞析系列【一】----LINQ In Javascript
2011-10-20 19:49 【當耐特】 閱讀(7572) 評論(23) 收藏 舉報一.LINQ簡介
LINQ,語言集成查詢(Language INtegrated Query)是一組用于c#和Visual Basic語言的擴展。它允許編寫C#或者Visual Basic代碼以查詢數(shù)據(jù)庫相同的方式操作內存數(shù)據(jù)。
LINQ的出現(xiàn)是基于泛型、擴展方法、Lambda表達式之上,或者說LINQ==Lambda表達式+擴展方法。
二.LINQ的好處
1、無需復雜學習過程即可上手
2、編寫更少代碼即可創(chuàng)建完整應用。
3、更快開發(fā)錯誤更少的應用程序。
4、無需求助奇怪的編程技巧就可操作數(shù)據(jù)源。
5、讓新開發(fā)者開發(fā)效率更高。
三.Javascript也可以LINQ一把
沒有JSLINQ的日子是痛苦的,沒有JSLINQ讓我恨不得用XNA去寫游戲。
在我用javascript編寫一些游戲的時候,總是離不開Array。什么對象、point,都塞到在Array當中。
比如我寫火拼俄羅斯方塊的時候,判斷一行是否堆滿,然后進行消除。我是這樣寫:
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);
}
}
寫出這么糟糕的代碼,是有歷史原因的。好吧,我總是為自己找借口。雖然寫出這么糟糕的代碼,但是我會惦記著它,因為我知道它一定可以優(yōu)化,可以更簡潔。因為有了linq to javascript:
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的心臟部分挖了出來。我們可以這樣使用它:
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查詢:
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查詢:
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.
四.思考題
如果我想這么查,該怎么辦?
var result4 = JSLINQ(People).
Where(function (item) { return item.BookIDs.Contain(1001); });
浙公網(wǎng)安備 33010602011771號