Skip to content

Indomitable/modern-linq

Folders and files

NameName
Last commit message
Last commit date

Latest commit

9bc7934 · Dec 24, 2019
Aug 8, 2019
Dec 24, 2019
Dec 24, 2019
Aug 10, 2019
Aug 7, 2019
Aug 2, 2019
Aug 7, 2019
Aug 14, 2019
Aug 1, 2019
Aug 7, 2019
Aug 22, 2019
Aug 8, 2019
Dec 24, 2019
Aug 22, 2019
Aug 12, 2019
Dec 24, 2019
Dec 24, 2019
Dec 24, 2019

Repository files navigation

Modern-Linq

Modern-Linq is a library that brings the C# linq functionality into JavaScript. It is based on the native Iterable funtionality in JavaScript.

Examples:

const query = fromIterable([1, 2, 3, 4, 5, 6, 7])
               .where(_ => _ % 2 === 0)
               .select(_ => _ * 2);
const query = range(0, 30)
            .select(i => i * 3)
            .where(i => i > 10)
            .select(i =>
                ({
                    odd: i % 2 === 1,
                    even: i % 2 === 0,
                    num: i
                })
            )
            .skip(1)
            .take(4)
            .groupBy(i => i.odd)
            .select(_ => ({
                key: _.key,
                items: _.orderByDescending(_ => _.num).toArray()
            }))
            .orderBy(_ => _.key);

To consume the data we can use:

const arr = query.toArray();
const arr = Array.from(query); 
for (const item of query) {
    console.log(item); // Prints 4, 8, 12
}

Remarks:

  1. The data is processed in the moment when is requested.
  2. The sequence is immutable the output !== input

Some of the methods are using native Array implementation if the provided source is an Array Methods with native fallback:

  • select: uses Array.prototype.map
  • where: uses Array.prototype.filter
  • take: uses Array.prototype.slice
  • skip: uses Array.prototype.slice
  • distinct: if no comparer is provided it uses native Set class
  • count: returns Array.prototype.length
  • orderBy: Array.prototype.sort
  • concat: uses spread operator

Methods implemented:

  • aggregate

  • any

  • all

  • concat

  • count

  • distinct

  • elementAt

  • first

  • firstOrDefault

  • groupJoin

  • join

  • intersect

  • last

  • lastOrDefault

  • max

  • min

  • ofType

  • orderBy

  • range

  • repeat

  • reverse

  • select

  • selectMany

  • isEqual ( sequenceEqual )

  • single

  • skip

  • skipLast

  • skipWhile

  • sum

  • take

  • takeLast

  • takeWhile

  • union

  • where

  • toArray ( toList )

  • toMap ( toDictionary )

  • toSet

Waiting for implementation:

  • contains
  • except
  • zip

Extra methods

  • isElementsEqual: checks if two sequences have same elements, no matter of the position.
  • product: get the product of sequence.
  • join (with string argument): join all elements of sequence and concat with separator
  • allAndEvery: check a condition against all elements of sequence and sequence should not be empty.
  • firstOrThrow: returns first element if none throw error.
  • lastOrThrow: returns last element if none throw error.
  • fistIndex: return index of first element which is true for a predicate
  • lastIndex: return index of last element which is true for a predicate

Build status:
Build Status