Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
JavaScript equivalents of some common C# LINQ methods. To help me remember!
// JS array equivalents to C# LINQ methods - by Dan B.
// First: This version using older JavaScript notation for universal browser support (scroll down for ES6 version):
// Here's a simple array of "person" objects
var people = [
{ name: "John", age: 20 },
{ name: "Mary", age: 35 },
{ name: "Arthur", age: 78 },
{ name: "Mike", age: 27 },
{ name: "Judy", age: 42 },
{ name: "Tim", age: 8 }
];
// filter is equivalent to Where
var youngsters = people.filter(function (item) {
return item.age < 30;
});
console.log("People younger than 30:", youngsters);
// map is equivalent to Select
var names = people.map(function (item) {
return item.name;
});
console.log("Just the names of people:", names);
// every is equivalent to All
var allUnder40 = people.every(function (item) {
return item.age < 40;
});
console.log("Are all people under 40?", allUnder40); // false
// some is equivalent to Any
var anyUnder30 = people.some(function (item) {
return item.age < 30;
});
console.log("Are any people under 30?", anyUnder30); // true
// reduce is "kinda" equivalent to Aggregate (and also can be used to Sum)
var aggregate = people.reduce(function (item1, item2) {
return { name: '', age: item1.age + item2.age };
});
console.log("Aggregate age", aggregate.age); // { age: 210 }
// sort is "kinda" like OrderBy (but it sorts the array in place - eek!)
var orderedByName = people.sort(function (a, b) {
return a.name < b.name ? 1 : -1;
})
console.log("Ordered by name:", orderedByName);
// and, of course, you can chain function calls
var namesOfPeopleOver30OrderedDesc = people.filter(function (person) {
return person.age > 30;
}).
map(function (person) {
return person.name;
}).
sort(function (a, b) {
return a > b ? 1 : -1;
});
console.log("And now.. the names of all people over 30 ordered by name descending:", namesOfPeopleOver30OrderedDesc);
// Second: And now the more modern ES6 way of doing this using arrow functions (lambdas!)...
const peoples = [
{ name: "John", age: 20 },
{ name: "Mary", age: 35 },
{ name: "Arthur", age: 78 },
{ name: "Mike", age: 27 },
{ name: "Judy", age: 42 },
{ name: "Tim", age: 8 }
];
// filter is equivalent to Where
const youngPeople = peoples.filter(p => p.age < 30);
console.log("People younger than 30:", youngPeople);
// map is equivalent to Select
const justNames = peoples.map(p => p.name);
console.log("Just the names of people:", justNames);
// every is equivalent to All
const peopleUnder40 = peoples.every(p => p.age < 40);
console.log("Are all people under 40?", peopleUnder40); // false
// some is equivalent to Any
const areAnyUnder30 = peoples.some(p => p.age < 30);
console.log("Are any people under 30?", areAnyUnder30); // true
// reduce is "kinda" equivalent to Aggregate (and also can be used to Sum)
const aggregatedAge = peoples.reduce((p1, p2) => {
return { name: '', age: p1.age + p2.age }
});
console.log("Aggregate age:", aggregatedAge.age); // { age: 210 }
// sort is "kinda" like OrderBy (but it sorts the array in place - eek!)
const peopleOrderedByName = peoples.sort((p1, p2) => p1.name < p2.name ? 1 : -1);
console.log("Ordered by name:", peopleOrderedByName);
// and, of course, you can chain function calls
const peepsOver30OrderedDesc = peoples.filter(p => p.age > 30).map(p => p.name).sort((p1, p2) => p1 > p2 ? 1 : -1);
console.log("Chained", peepsOver30OrderedDesc);
@noseratio
Copy link

noseratio commented Oct 29, 2020

@axispod check out iterable-query - Query API for JavaScript Iterables and Async Iterables, I think it's very close to C# lazy LINQ.

@Workshop2
Copy link

Workshop2 commented Jan 22, 2021

Thanks so much

@aquino-a
Copy link

aquino-a commented Mar 10, 2021

nice

@uim-akhovyev
Copy link

uim-akhovyev commented Mar 15, 2021

Thank you!

@Kbllo
Copy link

Kbllo commented May 3, 2021

Thank you :D

@Serrin
Copy link

Serrin commented Jun 13, 2021

// sort is "kinda" like OrderBy (but it sorts the array in place - eek!)

var orderedByName = people.sort(function (a, b) {
	return  a.name > b.name ? 1 : -1;
})

console.log("Ordered by name"); 

console.log(orderedByName);

You can use this if you want to sort in a new array without change the original array (not in place):

var orderedByName = people.slice().sort(function (a, b) {
	return  a.name > b.name ? 1 : -1;
})

console.log("Ordered by name"); 
console.log(orderedByName);

console.log("Original array"); 
console.log(people);

@DanDiplo
Copy link
Author

DanDiplo commented Jun 15, 2021

Good shout @Serrin

@karmamaster
Copy link

karmamaster commented Jun 24, 2021

Thanks bro

@rskhan167
Copy link

rskhan167 commented Jul 30, 2021

Thanks a ton 👍

@SergeyDorofeev
Copy link

SergeyDorofeev commented Dec 3, 2021

It can also be written using arrow functions:

  const youngsters = people.filter(item => item.age < 30);
  const allUnder40 = people.every(item => item.age < 40); 
  const orderedByName = people.sort((a, b) => a.name > b.name ? 1 : -1);

@DanDiplo
Copy link
Author

DanDiplo commented Dec 3, 2021

@SergeyDorofeev Yeah, I keep meaning to update it with arrow functions, but they weren't widely available when I first wrote this!

@kigold
Copy link

kigold commented Mar 20, 2022

Nice

@euwiqo4487
Copy link

euwiqo4487 commented Apr 11, 2022

Thanks so much!!

@SudiDav
Copy link

SudiDav commented Aug 11, 2022

This is beautiful! ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment