tuna-jslinq
Version:
Linq methods for JavaScript/TypeScript for working with Arrays
1 lines • 7.85 kB
JavaScript
"use strict";var JSLinqOrderDirection,JSLinqHelper=function(){function n(){}return n.NonEnumerable=function(n,e){Object.defineProperty(Array.prototype,n,{value:e,enumerable:!1,configurable:!0})},n.OrderCompareFunction=function(n,e,r,i){var t=n(e),u=n(r),o=typeof t,l=typeof u;if("string"===o&&o===l){var a=t,s=u;return(a=a.toLowerCase())>(s=s.toLowerCase())?!0===i?-1:1:a<s?!0===i?1:-1:0}if("number"===o&&o===l){return!0===i?u-t:t-u}if("boolean"===o&&o===l){return t===u?0:!0===i?t?1:-1:t?-1:1}return"undefined"===o&&o===l?0:"undefined"===o?i?1:-1:"undefined"===l?i?-1:1:0},n}(),JSLinq=function(n){return n&&!Array.isArray(n)&&(n=[n]),n||[]};JSLinqHelper.NonEnumerable("_JSLinq",{Order:void 0}),function(n){n[n.Ascending=0]="Ascending",n[n.Descending=1]="Descending"}(JSLinqOrderDirection||(JSLinqOrderDirection={}));var JSLinqOrder=function(){return function(n,e){this.direction=n,this.selector=e}}();JSLinqHelper.NonEnumerable("Add",function(n){return this.push(n),this}),JSLinqHelper.NonEnumerable("AddRange",function(n){var e=this;return n.ForEach(function(n){return e.push(n)}),this}),JSLinqHelper.NonEnumerable("Aggregate",function(n,e){return this.reduce(n,e)}),JSLinqHelper.NonEnumerable("All",function(n){return this.Count(n)===this.Count()}),JSLinqHelper.NonEnumerable("Any",function(n){if(!n)return this.length>0;var e=!1;return this.ForEach(function(r,i){return e=!0===n(r,i)}),e}),JSLinqHelper.NonEnumerable("Average",function(n){return this.Sum(n)/this.Count()}),JSLinqHelper.NonEnumerable("Clear",function(){return this.length=0,this}),JSLinqHelper.NonEnumerable("Clone",function(){return this.slice(0)}),JSLinqHelper.NonEnumerable("Concat",function(n){return this.concat(n)}),JSLinqHelper.NonEnumerable("Contains",function(n){return this.Any(function(e){return e===n})}),JSLinqHelper.NonEnumerable("Count",function(n){return n?this.Where(n).length:this.length}),JSLinqHelper.NonEnumerable("Distinct",function(n){var e=new Array,r=this.GroupBy(n);for(var i in r){var t=r[i];t.Any()&&e.Add(t[0])}return e}),JSLinqHelper.NonEnumerable("FindIndex",function(n){if(!n)throw new Error("Tuna-JSLinq: You must define a selector");var e=-1;return this.ForEach(function(r,i){var t=!0===n(r,i);return t&&(e=i),t}),e}),JSLinqHelper.NonEnumerable("FindLastIndex",function(n){if(!n)throw new Error("Tuna-JSLinq: You must define a selector");for(var e=this.length;e--;)if(!0===n(this[e],e))return e;return-1}),JSLinqHelper.NonEnumerable("First",function(n){var e=this.FirstOrDefault(n);if(e)return e;throw new Error("Tuna-JSLinq: The First Entry was not found")}),JSLinqHelper.NonEnumerable("FirstOrDefault",function(n){if(!n)return this.length>0?this[0]:null;var e=null;return this.ForEach(function(r,i){var t=!0===n(r,i);return t&&(e=r),t}),e}),JSLinqHelper.NonEnumerable("ForEach",function(n){for(var e=this.length,r=0;r<e;r++){if(!0===n(this[r],r))break}return this}),JSLinqHelper.NonEnumerable("Get",function(n){var e=this[n];return void 0===e?null:e}),JSLinqHelper.NonEnumerable("GroupBy",function(n){return this.reduce(function(e,r){var i=n?n(r):r;return e[i]=e[i]||[],e[i].push(r),e},{})}),JSLinqHelper.NonEnumerable("Insert",function(n,e){return this.splice(e,0,n),this}),JSLinqHelper.NonEnumerable("Intersect",function(n){return this.Where(function(e){return n.Contains(e)})}),JSLinqHelper.NonEnumerable("Join",function(n,e){var r=this;return e&&(r=this.Select(e)),r.join(n)}),JSLinqHelper.NonEnumerable("Last",function(n){var e=this.LastOrDefault(n);if(e)return e;throw new Error("Tuna-JSLinq: The Last Entry was not found")}),JSLinqHelper.NonEnumerable("LastOrDefault",function(n){if(!n)return this.length>0?this[this.length-1]:null;for(var e=null,r=this.length;r--;){var i=this[r];if(!0===n(i,r)){e=i;break}}return e}),JSLinqHelper.NonEnumerable("Max",function(n){var e=n||function(n){return n};return this.OrderBy(e).LastOrDefault()}),JSLinqHelper.NonEnumerable("Min",function(n){var e=n||function(n){return n};return this.OrderBy(e).FirstOrDefault()}),JSLinqHelper.NonEnumerable("Move",function(n,e){return this.splice(e,0,this.splice(n,1)[0]),this}),JSLinqHelper.NonEnumerable("OrderBy",function(n){var e=this.Clone();return e._JSLinq.Order=new Array(new JSLinqOrder(JSLinqOrderDirection.Ascending,n)),e.sort(function(e,r){return JSLinqHelper.OrderCompareFunction(n,e,r,!1)})}),JSLinqHelper.NonEnumerable("OrderByDescending",function(n){var e=this.Clone();return e._JSLinq.Order=new Array(new JSLinqOrder(JSLinqOrderDirection.Descending,n)),e.sort(function(e,r){return JSLinqHelper.OrderCompareFunction(n,e,r,!0)})}),JSLinqHelper.NonEnumerable("Range",function(n,e){return this.Skip(n).Take(e)}),JSLinqHelper.NonEnumerable("Remove",function(n){var e=this.indexOf(n);return e>-1&&this.RemoveAt(e),this}),JSLinqHelper.NonEnumerable("RemoveAll",function(n){if(!n)return this.Clear();for(var e=this.length;e--;){!0===n(this[e],e)&&this.RemoveAt(e)}return this}),JSLinqHelper.NonEnumerable("RemoveAt",function(n){return this.splice(n,1),this}),JSLinqHelper.NonEnumerable("RemoveRange",function(n,e){var r=this;return this.Skip(n).Take(e).ForEach(function(n){return r.Remove(n)}),this}),JSLinqHelper.NonEnumerable("Repeat",function(n,e){for(var r=0;r<e;r++)this.Add(n);return this}),JSLinqHelper.NonEnumerable("Reverse",function(){return this.reverse()}),JSLinqHelper.NonEnumerable("Select",function(n){var e=new Array;return this.ForEach(function(r,i){var t=n(r,i);e.Add(t)}),e}),JSLinqHelper.NonEnumerable("SelectMany",function(n){var e=new Array;return this.ForEach(function(r,i){var t=n(r,i)||[];e.AddRange(t)}),e}),JSLinqHelper.NonEnumerable("SequenceEqual",function(n){if(this===n)return!0;if(this.length!==n.length)return!1;for(var e=0;e<this.length;e++){if(this[e]!==n[e])return!1}return!0}),JSLinqHelper.NonEnumerable("Single",function(n){var e=n?this.Where(n):this;if(1!==e.Count())throw new Error("Tuna-JSLinq: The array does not contain exactly one element");return e.First()}),JSLinqHelper.NonEnumerable("SingleOrDefault",function(n){return this.Any(n)?this.Single(n):null}),JSLinqHelper.NonEnumerable("Skip",function(n){return this.slice(n,this.Count())}),JSLinqHelper.NonEnumerable("Sum",function(n){var e=0,r=n||function(n){return n};return this.ForEach(function(n){e+=r(n)}),e}),JSLinqHelper.NonEnumerable("Take",function(n){return this.slice(0,n)}),JSLinqHelper.NonEnumerable("TakeWhile",function(n){for(var e=[],r=this.length,i=0;i<r&&!0===n(this[i],i);)e.push(this[i++]);return e}),JSLinqHelper.NonEnumerable("ThenBy",function(n){var e=this._JSLinq.Order;if(null==e||!e.Any())throw new Error("Tuna-JSLinq: Please call OrderBy or OrderByDescending before ThenBy");return e.Add(new JSLinqOrder(JSLinqOrderDirection.Ascending,n)),this.sort(function(n,r){for(var i=0,t=e;i<t.length;i++){var u=t[i],o=JSLinqHelper.OrderCompareFunction(u.selector,n,r,u.direction===JSLinqOrderDirection.Descending);if(0!==o)return o}return 0})}),JSLinqHelper.NonEnumerable("ThenByDescending",function(n){var e=this._JSLinq.Order;if(null==e||!e.Any())throw new Error("Tuna-JSLinq: Please call OrderBy or OrderByDescending before ThenByDescending");return e.Add(new JSLinqOrder(JSLinqOrderDirection.Descending,n)),this.sort(function(n,r){for(var i=0,t=e;i<t.length;i++){var u=t[i],o=JSLinqHelper.OrderCompareFunction(u.selector,n,r,u.direction===JSLinqOrderDirection.Descending);if(0!==o)return o}return 0})}),JSLinqHelper.NonEnumerable("ToDictionary",function(n,e){var r=this.GroupBy(n);if(e)for(var i in r)r[i]=r[i].Select(e);return r}),JSLinqHelper.NonEnumerable("Union",function(n){return this.Concat(n).Distinct()}),JSLinqHelper.NonEnumerable("Where",function(n){if(!n)throw new Error("Tuna-JSLinq: You must define a selector");var e=new Array;return this.ForEach(function(r,i){!0===n(r,i)&&e.push(r)}),e}),JSLinqHelper.NonEnumerable("Zip",function(n,e){var r=new Array;return this.ForEach(function(i,t){null!=i&&r.Add(e(i,n[t]))}),r});