Som udvikler i .NET verdenen med LINQ som first class citizen, kan man ved første øjekast på JavaScript mangle nogle operationer. Der er endda en række biblioteker der implementerer disse, men er man bare ude i en get-the-job-done-situation er de mest brugte funktioner lige ved hånden. (Leder man efter aspekter som Lazy-evaluering eller observables er henholdsvis linq.js og RxJS bedre bud.)
Jeg vil her liste de mest almindelige udtryk og deres JavaScript ækvivalenter cheat-sheet-style. Bemærk at jeg bruger Lambdaudtryk i JavaScript for at få koden lidt mere koncis men hvis du ikke har adgang til dette er det bare at erstatte udtryk som fx:
[code language=”javascript” light=”true”]
(data) => {}[/code]
med
[code language=”javascript” light=”true”]
function(data) {}[/code]
Alle operationer afvikles mod dette eksempel:
[code language=”javascript” light=”true”]
var persons = [
{ firstname: ‘Peter’, lastname: ‘Jensen’, type: ‘Person’, age: 30 },
{ firstname: ‘Anne’, lastname: ‘Jensen’, type: ‘Person’, age: 50 },
{ firstname: ‘Kurt’, lastname: ‘Hansen’, type: ‘Person’, age: 40 }
];[/code]
Bemærk at nogle af operationerne modificerer det oprindelige array, hvis man ikke ønsker det kan man blot klone den med:
[code language=”javascript” light=”true”]
persons.slice(0);[/code]
Hver operation er her navngivet efter funktionens navn i LINQ:
[code language=”csharp” light=”true”]
var result = persons.All(person => person.type == "Person");[/code]
[code language=”javascript” light=”true”]
var result = persons.filter(person => person.type == ‘Person’).length == persons.length;[/code]
[code language=”csharp” light=”true”]
var result = persons.Concat(persons);[/code]
[code language=”javascript” light=”true”]
var result = persons.concat(persons);[/code]
[code language=”csharp” light=”true”]
var result = persons.Count();[/code]
[code language=”javascript” light=”true”]
var result = persons.length;[/code]
[code language=”csharp” light=”true”]
var lastnames = persons.Select(person => person.lastname);
var result = lastnames.Distinct();
[/code]
[code language=”javascript” light=”true”]
var lastnames = persons.map(person => person.lastname);
var result = lastnames.filter((value, index) => lastnames.indexOf(value) == index);[/code]
[code language=”csharp” light=”true”]
var result = Enumerable.Empty<dynamic>();[/code]
[code language=”javascript” light=”true”]
var result = [];[/code]
[code language=”csharp” light=”true”]
var result = persons.First();[/code]
[code language=”javascript” light=”true”]
var result = persons[0];
if (!result) throw new Error(‘Expected at least one element to take first’)[/code]
[code language=”csharp” light=”true”]
var result = persons.FirstOrDefault();[/code]
[code language=”javascript” light=”true”]
var result = persons[0];[/code]
[code language=”csharp” light=”true”]
var fullnames = new List<string>();
persons.ForEach(person => fullnames.Add(person.firstname + " " + person.lastname));[/code]
[code language=”javascript” light=”true”]
var fullnames = [];
persons.forEach(person => fullnames.push(person.firstname + ‘ ‘ + person.lastname))[/code]
[code language=”csharp” light=”true”]
var result = persons.GroupBy(person => person.lastname);[/code]
[code language=”javascript” light=”true”]
var result = persons.reduce((previous, person) => {
(previous[person.lastname] = previous[person.lastname] || []).push(person);
return previous;
}, []);[/code]
[code language=”csharp” light=”true”]
var result = persons.IndexOf(persons[2]);[/code]
[code language=”javascript” light=”true”]
var result = persons.indexOf(persons[2]);[/code]
[code language=”csharp” light=”true”]
var result = persons.Last();[/code]
[code language=”javascript” light=”true”]
var result = persons[persons.length-1];
if (!result) throw new Error(‘Expected at least one element to take last’)[/code]
[code language=”csharp” light=”true”]
var result = persons.LastOrDefault();[/code]
[code language=”javascript” light=”true”]
var result = persons[persons.length-1];[/code]
[code language=”csharp” light=”true”]
var result = persons.OrderBy(person => person.firstname);[/code]
[code language=”javascript” light=”true”]
persons.sort((person1, person2) => person1.firstname.localeCompare(person2.firstname));[/code]
[code language=”csharp” light=”true”]
var result = persons.OrderByDescending(person => person.firstname);[/code]
[code language=”javascript” light=”true”]
persons.sort((person1, person2) => person2.firstname.localeCompare(person1.firstname));[/code]
[code language=”csharp” light=”true”]
persons.Reverse();[/code]
[code language=”javascript” light=”true”]
var result = persons.reverse();[/code]
[code language=”csharp” light=”true”]
var result = persons.Select(person => new {fullname = person.firstname + " " + person.lastname});[/code]
[code language=”javascript” light=”true”]
var result = persons.map(person => ({ fullname: person.firstname + ‘ ‘ + person.lastname }) );[/code]
[code language=”csharp” light=”true”]
var result = persons.Single(person => person.firstname == "Peter");[/code]
[code language=”javascript” light=”true”]
var onePerson = persons.filter(person => person.firstname == "Peter");
if (onePerson.length != 1) throw new Error(‘Expected at excactly one element to take single’)
var result = onePerson[0];[/code]
[code language=”csharp” light=”true”]
var result = persons.Skip(2);[/code]
[code language=”javascript” light=”true”]
var result = persons.slice(2, persons.length); [/code]
[code language=”csharp” light=”true”]
var result = persons.Take(2);[/code]
[code language=”javascript” light=”true”]
var result = persons.slice(0, 2);[/code]
[code language=”csharp” light=”true”]
var result = persons.Where(person => person.lastname == "Jensen");[/code]
[code language=”javascript” light=”true”]
var result = persons.filter(person => person.lastname == ‘Jensen’);[/code]
Så tydeligvis behøver man ikke et bibliotek hvis man blot skal bruge de simple operationer. Ovenstående kode med tests er tilgængelig på GitHub.
This post is also available in English at Complexitymaze.com.