You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
6.6 KiB
��vaScript
187 lines
6.6 KiB
��vaScript
//-----------------------------------------------------------------------
|
|
// Part of the LINQ to JavaScript (JSLINQ) v2.10 Project - http://jslinq.codeplex.com
|
|
// Copyright (C) 2009 Chris Pietschmann (http://pietschsoft.com). All rights reserved.
|
|
// This project is licensed under the Microsoft Reciprocal License (Ms-RL)
|
|
// This license can be found here: http://jslinq.codeplex.com/license
|
|
//-----------------------------------------------------------------------
|
|
(function() {
|
|
JSLINQ = window.JSLINQ = function(dataItems) {
|
|
return new JSLINQ.fn.init(dataItems);
|
|
};
|
|
JSLINQ.fn = JSLINQ.prototype = {
|
|
init: function(dataItems) {
|
|
this.items = dataItems;
|
|
},
|
|
|
|
// The current version of JSLINQ being used
|
|
jslinq: "2.10",
|
|
|
|
ToArray: function() { return this.items; },
|
|
Where: function(clause) {
|
|
var item;
|
|
var newArray = new Array();
|
|
|
|
// The clause was passed in as a Method that return a Boolean
|
|
for (var index = 0; index < this.items.length; index++) {
|
|
if (clause(this.items[index], index)) {
|
|
newArray[newArray.length] = this.items[index];
|
|
}
|
|
}
|
|
return new JSLINQ(newArray);
|
|
},
|
|
Select: function(clause) {
|
|
var item;
|
|
var newArray = new Array();
|
|
|
|
// The clause was passed in as a Method that returns a Value
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
if (clause(this.items[i])) {
|
|
newArray[newArray.length] = clause(this.items[i]);
|
|
}
|
|
}
|
|
return new JSLINQ(newArray);
|
|
},
|
|
OrderBy: function(clause) {
|
|
var tempArray = new Array();
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
tempArray[tempArray.length] = this.items[i];
|
|
}
|
|
return new JSLINQ(
|
|
tempArray.sort(function(a, b) {
|
|
var x = clause(a);
|
|
var y = clause(b);
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
})
|
|
);
|
|
},
|
|
OrderByDescending: function(clause) {
|
|
var tempArray = new Array();
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
tempArray[tempArray.length] = this.items[i];
|
|
}
|
|
return new JSLINQ(
|
|
tempArray.sort(function(a, b) {
|
|
var x = clause(b);
|
|
var y = clause(a);
|
|
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
|
|
})
|
|
);
|
|
},
|
|
SelectMany: function(clause) {
|
|
var r = new Array();
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
r = r.concat(clause(this.items[i]));
|
|
}
|
|
return new JSLINQ(r);
|
|
},
|
|
Count: function(clause) {
|
|
if (clause == null)
|
|
return this.items.length;
|
|
else
|
|
return this.Where(clause).items.length;
|
|
},
|
|
Distinct: function(clause) {
|
|
var item;
|
|
var dict = new Object();
|
|
var retVal = new Array();
|
|
for (var i = 0; i < this.items.length; i++) {
|
|
item = clause(this.items[i]);
|
|
// TODO - This doens't correctly compare Objects. Need to fix this
|
|
if (dict[item] == null) {
|
|
dict[item] = true;
|
|
retVal[retVal.length] = item;
|
|
}
|
|
}
|
|
dict = null;
|
|
return new JSLINQ(retVal);
|
|
},
|
|
Any: function(clause) {
|
|
for (var index = 0; index < this.items.length; index++) {
|
|
if (clause(this.items[index], index)) { return true; }
|
|
}
|
|
return false;
|
|
},
|
|
All: function(clause) {
|
|
for (var index = 0; index < this.items.length; index++) {
|
|
if (!clause(this.items[index], index)) { return false; }
|
|
}
|
|
return true;
|
|
},
|
|
Reverse: function() {
|
|
var retVal = new Array();
|
|
for (var index = this.items.length - 1; index > -1; index--)
|
|
retVal[retVal.length] = this.items[index];
|
|
return new JSLINQ(retVal);
|
|
},
|
|
First: function(clause) {
|
|
if (clause != null) {
|
|
return this.Where(clause).First();
|
|
}
|
|
else {
|
|
// If no clause was specified, then return the First element in the Array
|
|
if (this.items.length > 0)
|
|
return this.items[0];
|
|
else
|
|
return null;
|
|
}
|
|
},
|
|
Last: function(clause) {
|
|
if (clause != null) {
|
|
return this.Where(clause).Last();
|
|
}
|
|
else {
|
|
// If no clause was specified, then return the First element in the Array
|
|
if (this.items.length > 0)
|
|
return this.items[this.items.length - 1];
|
|
else
|
|
return null;
|
|
}
|
|
},
|
|
ElementAt: function(index) {
|
|
return this.items[index];
|
|
},
|
|
Concat: function(array) {
|
|
var arr = array.items || array;
|
|
return new JSLINQ(this.items.concat(arr));
|
|
},
|
|
Intersect: function(secondArray, clause) {
|
|
var clauseMethod;
|
|
if (clause != undefined) {
|
|
clauseMethod = clause;
|
|
} else {
|
|
clauseMethod = function(item, index, item2, index2) { return item == item2; };
|
|
}
|
|
|
|
var sa = secondArray.items || secondArray;
|
|
|
|
var result = new Array();
|
|
for (var a = 0; a < this.items.length; a++) {
|
|
for (var b = 0; b < sa.length; b++) {
|
|
if (clauseMethod(this.items[a], a, sa[b], b)) {
|
|
result[result.length] = this.items[a];
|
|
}
|
|
}
|
|
}
|
|
return new JSLINQ(result);
|
|
},
|
|
DefaultIfEmpty: function(defaultValue) {
|
|
if (this.items.length == 0) {
|
|
return defaultValue;
|
|
}
|
|
return this;
|
|
},
|
|
ElementAtOrDefault: function(index, defaultValue) {
|
|
if (index >= 0 && index < this.items.length) {
|
|
return this.items[index];
|
|
}
|
|
return defaultValue;
|
|
},
|
|
FirstOrDefault: function(defaultValue) {
|
|
return this.First() || defaultValue;
|
|
},
|
|
LastOrDefault: function(defaultValue) {
|
|
return this.Last() || defaultValue;
|
|
}
|
|
};
|
|
JSLINQ.fn.init.prototype = JSLINQ.fn;
|
|
})(); |