{"id":1608,"date":"2024-05-31T22:00:00","date_gmt":"2024-05-31T20:00:00","guid":{"rendered":"https:\/\/demo.sidekick.be\/itenium\/array-prototype\/"},"modified":"2025-11-28T13:31:45","modified_gmt":"2025-11-28T12:31:45","slug":"array-prototype","status":"publish","type":"post","link":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/","title":{"rendered":"Array.prototype for .NET developers"},"content":{"rendered":"<p>Whenever you want to write a <code>for<\/code> to loop over an array, the <code>Array.prototype<\/code> functions probably allow you to achieve the same result but in more functional and succinct manner.<\/p>\n<p>Do note that the deferred execution we know from Linq does not apply to <code>Array.prototype<\/code>!<\/p>\n<h1 id=\"comparison-table\">Comparison Table<\/h1>\n<table class=\"table-code\">\n<thead>\n<tr>\n<th>C#<\/th>\n<th>JavaScript<\/th>\n<th>MDN Link<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Select()<\/td>\n<td><b>map<\/b>((cur, index, array): any)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/map\">map<\/a><\/td>\n<\/tr>\n<tr>\n<td>Where()<\/td>\n<td><b>filter<\/b>((cur): boolean)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/filter\">filter<\/a><\/td>\n<\/tr>\n<tr>\n<td>Contains()<\/td>\n<td><b>includes<\/b>(value, fromIndex)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/includes\">includes<\/a><\/td>\n<\/tr>\n<tr>\n<td>FirstOrDefault()<\/td>\n<td><b>find<\/b>((cur): boolean): undefined | any<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/find\">find<\/a> \/ <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/findIndex\">findIndex<\/a><\/td>\n<\/tr>\n<tr>\n<td>LastOrDefault()<\/td>\n<td><b>findLast<\/b>((cur): boolean): undefined | any<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/findLast\">findLast<\/a> \/ <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/findLastIndex\">findLastIndex<\/a><\/td>\n<\/tr>\n<tr>\n<td>All()<\/td>\n<td><b>every<\/b>((cur): boolean): boolean<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/every\">every<\/a><\/td>\n<\/tr>\n<tr>\n<td>Any()<\/td>\n<td><b>some<\/b>((cur): boolean): boolean<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/some\">some<\/a><\/td>\n<\/tr>\n<tr>\n<td>Concat()<\/td>\n<td><b>concat<\/b>(arr: any[]): any[]<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/concat\">concat<\/a><\/td>\n<\/tr>\n<tr>\n<td>Skip(start).Take(start &#8211; end)<\/td>\n<td><b>slice<\/b>(start = 0, end = length-1)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/slice\">slice<\/a><\/td>\n<\/tr>\n<tr>\n<td>string.Join()<\/td>\n<td><b>join<\/b>(separator = \u2018,\u2019)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/join\">join<\/a><\/td>\n<\/tr>\n<tr>\n<td>Array.IndexOf()<\/td>\n<td><b>findIndex<\/b>((cur): boolean): -1 | number<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/findIndex\">findIndex<\/a><\/td>\n<\/tr>\n<tr>\n<td>ElementAt()<\/td>\n<td><b>at<\/b>(index) (accepts negative indexes)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/at\">at<\/a><\/td>\n<\/tr>\n<tr>\n<td>Count()<\/td>\n<td><b>length<\/b>: number<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/length\">length<\/a><\/td>\n<\/tr>\n<tr>\n<td>SelectMany()<\/td>\n<td><b>flat<\/b>(levels = 1) \/ <b>flatMap<\/b>(fn)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/flat\">flat<\/a> \/ <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/flatMap\">flatMap<\/a><\/td>\n<\/tr>\n<tr>\n<td>GroupBy()<\/td>\n<td><b>Object.groupBy<\/b>(arr, groupFn)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Object\/groupBy\">groupBy<\/a><\/td>\n<\/tr>\n<tr>\n<td>Distinct()<\/td>\n<td><b>filter<\/b>((el, i, arr) =&gt; arr.indexOf(el) === i)<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Extension method<\/td>\n<td>forEach((cur): void): void<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/forEach\">forEach<\/a><\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><strong>Mutating in JS<\/strong><\/td>\n<td>These are <a href=\"https:\/\/en.wikipedia.org\/wiki\/In-place_algorithm\">in place<\/a> operations<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>OrderBy()<\/td>\n<td><b>sort<\/b>((a, b): number)<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/sort\">sort<\/a> \/ <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/toSorted\">toSorted<\/a><\/td>\n<\/tr>\n<tr>\n<td>Reverse()<\/td>\n<td>reverse()<\/td>\n<td><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/reverse\">reverse<\/a> \/ <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/toReversed\">toReversed<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1 id=\"commonly-used-methods\">Commonly used methods<\/h1>\n<h2 id=\"select--map\">Select = map<\/h2>\n<pre><code class=\"language-javascript\">\/\/ C#\nvar result = enumerable.Select(x =&gt; x);\n\n\/\/ JavaScript\nlet result = array.map(x =&gt; x);\n\n\/\/ Using spread to avoid mutation\nconst input = [{k: 1, v: true}, {k: 2, v: false}];\nconst result = input.map(x =&gt; ({...x, v: !x.v}))\n<\/code><\/pre>\n<p>When mapping to an object without code block, you need to wrap your object between extra parentheses like<\/p>\n<pre><code class=\"language-javascript\">[0, 1].map(x =&gt; ({value: x}));\n\n\/\/ Because without the extra parentheses\n[0, 1].map(x =&gt; {value: x});\n\/\/ --&gt; [undefined, undefined]\n\n\/\/ it is the same as writing:\n[0, 1].map(x =&gt; {\n  value: x; \/\/ No error, because JavaScript?\n  return undefined;\n});\n<\/code><\/pre>\n<h2 id=\"where-distinct--filter\">Where, Distinct = filter<\/h2>\n<p><code>Where<\/code> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/filter\"><code>filter<\/code><\/a> behave pretty much exactly alike. Linqs <code>Distinct<\/code> we\u2019ll need to implement ourselves.<\/p>\n<pre><code class=\"language-javascript\">const input = [0, 0, 1, 5, 5];\n\/\/ Equals true when the first occurrence of the value is the current value\nconst result = input.filter((element, index, array) =&gt; array.indexOf(element) === index);\n\/\/ Or: [...new Set(input)];\nexpect(result).toEqual([0, 1, 5]);\n<\/code><\/pre>\n<h2 id=\"aggregate-groupby---reduce\">Aggregate, GroupBy, \u2026 = reduce<\/h2>\n<p>Linq has Sum, Min, Max, Average, GroupBy, etc. While JavaScript doesn\u2019t have them, they can all be achieved trivially with <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/reduce\"><code>reduce<\/code><\/a><\/p>\n<p><!-- [apply](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Function\/apply) --><\/p>\n<p><strong>Sum, Min, Max, Average<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">const input = [0, 1];\nconst sum = input.reduce((total, cur) =&gt; total + cur, 0);\nconst average = sum \/ input.length;\nconst min = Math.min.apply(Math, input); \/\/ Old school\nconst min = Math.min(...input); \/\/ Using spread\n<\/code><\/pre>\n<p><strong>Aggregate, GroupBy<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">const input = [0, 1, 2, 3];\n\nconst result = input.reduce((acc, cur) =&gt; {\n  if (cur % 2 === 0) {\n    acc.even.push(cur);\n  } else {\n    acc.odd.push(cur);\n  }\n  return acc;\n}, {even: [], odd: []});\n\nexpect(result).toEqual({even: [0, 2], odd: [1, 3]});\n<\/code><\/pre>\n<p>Since 2024, JS has a dedicated <code>Object.groupBy<\/code>:<\/p>\n<pre><code class=\"language-js\">const socks = [\n  { name: 'JavaScript', type: 'lang' },\n  { name: 'Angular', type: 'package' },\n  { name: 'React', type: 'package' },\n];\n\nconst grouped = Object.groupBy(socks, sock =&gt; sock.type);\n\nexpect(grouped).toEqual({\n  lang: [{ name: 'JavaScript', type: 'lang' }],\n  package: [\n    { name: 'Angular', type: 'package' },\n    { name: 'React', type: 'package' },\n  ]\n})\n<\/code><\/pre>\n<h2 id=\"slice\">slice<\/h2>\n<p>Linq has First, Last, Skip, SkipLast, SkipWhile, Take, TakeLast, TakeWhile. JavaScript has <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/slice\"><code>slice<\/code><\/a>.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Shallow copy\nconst input = [0, 1, 2, 3];\nexpect(input.slice()).toEqual([...input]);\n\n\/\/ Signature\nslice(startIndex = 0, endIndex = length-1);\n<\/code><\/pre>\n<h3 id=\"c-ranges\">C# Ranges<\/h3>\n<pre><code class=\"language-c#\">var array = new[] { 1, 2, 3, 4, 5 };\n\nAssert.Equal(new[] { 3, 4 }, array[2..^1]);\nAssert.Equal(new[] { 1, 2 }, array[..^3]);\nAssert.Equal(new[] { 3, 4, 5 }, array[2..]);\nAssert.Equal(new[] { 1, 2, 3, 4, 5 }, array[..]);\n<\/code><\/pre>\n<h3 id=\"with\">with<\/h3>\n<p>Since 2023, there is also <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/with\"><code>with<\/code><\/a> which returns a new array where one item is replaced with a new value by index.<\/p>\n<pre><code class=\"language-js\">const newArr = arr.with(index, newValue);\n<\/code><\/pre>\n<h1 id=\"mutations\">Mutations<\/h1>\n<p>These functions operate in place.<br \/> Since ECMAScript 2023, some have non-mutating alternatives!<\/p>\n<h2 id=\"orderby--sort-and-tosorted\">OrderBy = sort and toSorted<\/h2>\n<ul>\n<li>Use <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/toSorted\">toSorted<\/a> if you need a new array for the sorted result.<\/li>\n<li><strong>Without compareFn the array is sorted according to each character\u2019s Unicode code point value.<\/strong><\/li>\n<li>The compareFn should return a number:\n<ul>\n<li><code>-1<\/code> (or any negative number): <code>a<\/code> comes <strong>before<\/strong><code>b<\/code><\/li>\n<li><code>0<\/code>: Equal<\/li>\n<li><code>1<\/code> (or any positive number): <code>a<\/code> comes <strong>after<\/strong><code>b<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre><code class=\"language-javascript\">\/\/ Numbers\n[10, 5].sort(); \/\/ [10, 5]: each element is converted to a string\n[10, 5].sort((a, b) =&gt; a - b); \/\/ [5, 10]\n\n\/\/ Strings\n['z', 'e', '\u00e9'].sort(); \/\/ ['e', 'z', '\u00e9']\n['z', 'e', '\u00e9'].sort((a, b) =&gt; a.localeCompare(b)); \/\/ ['e', '\u00e9', 'z']\n\n\/\/ Dates\n[d1, d2, d3].sort((a, b) =&gt; a.getTime() - b.getTime());\n<\/code><\/pre>\n<p><strong>C#<\/strong><\/p>\n<ul>\n<li>The signature is a bit different: <code>OrderBy(Func&lt;TSource, TKey&gt; keySelector, IComparer&lt;TKey&gt; comparer)<\/code><\/li>\n<li><code>OrderBy<\/code> vs <code>OrderByDescending<\/code>: switch <code>a<\/code> and <code>b<\/code>\u2026<\/li>\n<li>JS doesn\u2019t have <code>ThenBy<\/code> chaining possibilities, you\u2019ll have to do this yourself.<\/li>\n<\/ul>\n<h2 id=\"foreach\">forEach<\/h2>\n<p>While <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/forEach\"><code>forEach<\/code><\/a> is not really doing any mutation by itself, it is often what it\u2019s used for. Mutations are especially dangerous in for example a Redux environment where UI changes might lag. The same can usually be achieved with <code>map<\/code>.<\/p>\n<pre><code class=\"language-javascript\">const input = [{value: 1, visited: 0}, {value: 2, visited: 0}];\n\n\/\/ Potentially dangerous\ninput.forEach(el =&gt; {\n    el.visited++;\n});\n\n\/\/ ...el will create a shallow copy only!\nconst result = input.map(el =&gt; ({...el, visited: el.visited + 1}));\n\n\/\/ Or use the good old loop?\nfor (let itm of input) {\n    console.log(itm.value);\n}\n<\/code><\/pre>\n<h2 id=\"other-mutators\">Other mutators<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/reverse\"><code>reverse()<\/code><\/a>: There is now also <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/toReversed\"><code>toReversed()<\/code><\/a> (2023)<\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/push\"><code>push(el1, [el2, ...])<\/code><\/a>: Add element(s) at the end. Returns the new array length.<\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/shift\"><code>shift()<\/code><\/a>: Remove the first element at the start. Returns the removed element.<\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/unshift\"><code>unshift(el, [el2, ...])<\/code><\/a>: Add element(s) at the start. Returns the new array length.<\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/splice\"><code>splice(start, [deleteCount, [el1, [el2, ...]]])<\/code><\/a>\n<ul>\n<li>The swiss army knife: add and\/or remove element(s)<\/li>\n<li>Returns array of removed elements (or empty array)<\/li>\n<li>There is now also <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\/toSpliced\">toSpliced<\/a> (2023)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1 id=\"linq-for-ages-5-and-up\">Linq for ages 5 and up<\/h1>\n<p>Thanks <a href=\"https:\/\/x.com\/bewidec\/status\/935573858136051713\">Wim De Cleen<\/a> (and Martin Fowler) for this amazing diagram, I love it!<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/itenium-be.github.io\/blog-posts-new\/assets\/blog-images\/Array.prototype-fowler-diagrams.jpg\" alt=\"Explain LINQ to a 5 year old\" title=\"Explain LINQ to a 5 year old\" class=\"img-responsive\" \/><\/p>\n<h1>Extras<\/h1>\n<p><b>Stuff that came into being during the making of this post<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/itenium-be\/Array.prototype\">Github source code as UnitTests<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/itenium-be\/ModernJS\">Jest UnitTests for all ECMAScript features since 2019<\/a><\/li>\n<\/ul>\n<p><b>Other interesting reads<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/msn0\/mdn-polyfills\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/msn0\/mdn-polyfills.svg?style=social&#038;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/msn0\/mdn-polyfills\">msn0\/mdn-polyfills<\/a>: Include polyfills for your favourite functions that are not (yet) implemented by your browser(s).<\/li>\n<li><a href=\"http:\/\/2ality.com\/\">2ality.com: Blogging on ES proposals<\/a><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/a\/200614\/540352\">StackOverflow: Jon Skeet on why there is no forEach in Linq<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/morelinq\/MoreLINQ\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/morelinq\/MoreLINQ.svg?style=social&#038;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/morelinq\/MoreLINQ\">morelinq\/MoreLINQ<\/a>: Extensions to LINQ to Objects<\/li>\n<li><a href=\"https:\/\/esdiscuss.org\/topic\/having-a-non-enumerable-array-prototype-contains-may-not-be-web-compatible\">MooTools: Why Contains is called includes in JavaScript<\/a><\/li>\n<\/ul>\n<h1>Updates<\/h1>\n<ul>\n<li> 1 June 2024: Added Object.groupBy<\/li>\n<li> 6 October 2023: More updates for ECMAScript 2023<\/li>\n<li> 4 September 2023: Added flat and flatMap<\/li>\n<li> 8 March 2023: Added Distinct, flatMap<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Array\"><code>Array.prototype<\/code><\/a> functions have been available for a long time but it\u2019s since <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Functions\/Arrow_functions\">Arrow functions<\/a> that \u201cLinq lambda syntax\u201d-like functionality is available in JavaScript.<\/p>\n<p>This blog post explains the most common functions by comparing them to their C# equivalents.<\/p>\n<p>A basic example:<\/p>\n<pre><code class=\"language-javascript\">\/\/ JavaScript\nconst result = [0, 1, 2, 3, null]\n    .filter(x =&gt; x !== null)\n    .map(x =&gt; x * 10)\n    .sort((a, b) =&gt; b - a);\n\nexpect(result).toEqual([30, 20, 10, 0]);\n\n\/\/ C#\nvar result = new int?[] {0, 1, 2, 3, null}\n    .Where(x =&gt; x != null)\n    .Select(x =&gt; x * 10)\n    .OrderByDescending(x =&gt; x)\n    .ToArray();\n<\/code><\/pre>\n","protected":false},"author":1,"featured_media":2088,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[3],"tags":[13,6],"class_list":["post-1608","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-cheat-sheet","tag-tutorial"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Array.prototype for .NET developers - Itenium<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Array.prototype for .NET developers - Itenium\" \/>\n<meta property=\"og:description\" content=\"The Array.prototype functions have been available for a long time but it\u2019s since Arrow functions that \u201cLinq lambda syntax\u201d-like functionality is available in JavaScript.This blog post explains the most common functions by comparing them to their C# equivalents.A basic example: \/\/ JavaScript const result = [0, 1, 2, 3, null]   .filter(x =&gt; x !== null)   .map(x =&gt; x * 10)   .sort((a, b) =&gt; b - a); expect(result).toEqual([30, 20, 10, 0]); \/\/ C# var result = new int?[] {0, 1, 2, 3, null}   .Where(x =&gt; x != null)   .Select(x =&gt; x * 10)   .OrderByDescending(x =&gt; x)   .ToArray();\" \/>\n<meta property=\"og:url\" content=\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/\" \/>\n<meta property=\"og:site_name\" content=\"Itenium\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-31T20:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-28T12:31:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png\" \/>\n\t<meta property=\"og:image:width\" content=\"360\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Usdevelop\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Usdevelop\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/\",\"name\":\"Array.prototype for .NET developers - Itenium\",\"isPartOf\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png\",\"datePublished\":\"2024-05-31T20:00:00+00:00\",\"dateModified\":\"2025-11-28T12:31:45+00:00\",\"author\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\"},\"breadcrumb\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#primaryimage\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png\",\"contentUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png\",\"width\":360,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/demo.sidekick.be\/itenium\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Array.prototype for .NET developers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/\",\"name\":\"Itenium\",\"description\":\"We build software. We build careers.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\",\"name\":\"Usdevelop\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"caption\":\"Usdevelop\"},\"sameAs\":[\"https:\/\/demo.sidekick.be\/itenium\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Array.prototype for .NET developers - Itenium","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Array.prototype for .NET developers - Itenium","og_description":"The Array.prototype functions have been available for a long time but it\u2019s since Arrow functions that \u201cLinq lambda syntax\u201d-like functionality is available in JavaScript.This blog post explains the most common functions by comparing them to their C# equivalents.A basic example: \/\/ JavaScript const result = [0, 1, 2, 3, null]   .filter(x =&gt; x !== null)   .map(x =&gt; x * 10)   .sort((a, b) =&gt; b - a); expect(result).toEqual([30, 20, 10, 0]); \/\/ C# var result = new int?[] {0, 1, 2, 3, null}   .Where(x =&gt; x != null)   .Select(x =&gt; x * 10)   .OrderByDescending(x =&gt; x)   .ToArray();","og_url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/","og_site_name":"Itenium","article_published_time":"2024-05-31T20:00:00+00:00","article_modified_time":"2025-11-28T12:31:45+00:00","og_image":[{"width":360,"height":300,"url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png","type":"image\/png"}],"author":"Usdevelop","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Usdevelop","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/","url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/","name":"Array.prototype for .NET developers - Itenium","isPartOf":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#website"},"primaryImageOfPage":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#primaryimage"},"image":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#primaryimage"},"thumbnailUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png","datePublished":"2024-05-31T20:00:00+00:00","dateModified":"2025-11-28T12:31:45+00:00","author":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022"},"breadcrumb":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#primaryimage","url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png","contentUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/Array.prototype.png","width":360,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/array-prototype\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/demo.sidekick.be\/itenium\/"},{"@type":"ListItem","position":2,"name":"Array.prototype for .NET developers"}]},{"@type":"WebSite","@id":"https:\/\/demo.sidekick.be\/itenium\/#website","url":"https:\/\/demo.sidekick.be\/itenium\/","name":"Itenium","description":"We build software. We build careers.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022","name":"Usdevelop","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","caption":"Usdevelop"},"sameAs":["https:\/\/demo.sidekick.be\/itenium"]}]}},"_links":{"self":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/comments?post=1608"}],"version-history":[{"count":3,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1608\/revisions"}],"predecessor-version":[{"id":2299,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1608\/revisions\/2299"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media\/2088"}],"wp:attachment":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media?parent=1608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/categories?post=1608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/tags?post=1608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}