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:
(data) => {}
med
function(data) {}
Alle operationer afvikles mod dette eksempel:
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 } ];
Bemærk at nogle af operationerne modificerer det oprindelige array, hvis man ikke ønsker det kan man blot klone den med:
persons.slice(0);
Hver operation er her navngivet efter funktionens navn i LINQ:
var result = persons.All(person => person.type == "Person");
var result = persons.filter(person => person.type == 'Person').length == persons.length;
var result = persons.Concat(persons);
var result = persons.concat(persons);
var result = persons.Count();
var result = persons.length;
var lastnames = persons.Select(person => person.lastname); var result = lastnames.Distinct();
var lastnames = persons.map(person => person.lastname); var result = lastnames.filter((value, index) => lastnames.indexOf(value) == index);
var result = Enumerable.Empty<dynamic>();
var result = [];
var result = persons.First();
var result = persons[0]; if (!result) throw new Error('Expected at least one element to take first')
var result = persons.FirstOrDefault();
var result = persons[0];
var fullnames = new List<string>(); persons.ForEach(person => fullnames.Add(person.firstname + " " + person.lastname));
var fullnames = []; persons.forEach(person => fullnames.push(person.firstname + ' ' + person.lastname))
var result = persons.GroupBy(person => person.lastname);
var result = persons.reduce((previous, person) => { (previous[person.lastname] = previous[person.lastname] || []).push(person); return previous; }, []);
var result = persons.IndexOf(persons[2]);
var result = persons.indexOf(persons[2]);
var result = persons.Last();
var result = persons[persons.length-1]; if (!result) throw new Error('Expected at least one element to take last')
var result = persons.LastOrDefault();
var result = persons[persons.length-1];
var result = persons.OrderBy(person => person.firstname);
persons.sort((person1, person2) => person1.firstname.localeCompare(person2.firstname));
var result = persons.OrderByDescending(person => person.firstname);
persons.sort((person1, person2) => person2.firstname.localeCompare(person1.firstname));
persons.Reverse();
var result = persons.reverse();
var result = persons.Select(person => new {fullname = person.firstname + " " + person.lastname});
var result = persons.map(person => ({ fullname: person.firstname + ' ' + person.lastname }) );
var result = persons.Single(person => person.firstname == "Peter");
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];
var result = persons.Skip(2);
var result = persons.slice(2, persons.length);
var result = persons.Take(2);
var result = persons.slice(0, 2);
var result = persons.Where(person => person.lastname == "Jensen");
var result = persons.filter(person => person.lastname == 'Jensen');
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.