понедельник, 28 августа 2017 г.

LINQ для JavaScript

Многие разрабтчики C# привыкли использовать LINQ и очень часто сталкиваются с проблемами когда требуется выполнить подобные операции на JavaScript. К счастью JavaScript позволяет сделать практически то же самое что и LINQ с помощью нативных функций, не прибегая к использованию сторонних библиотек. Данная статья составлена в виде шпаргалки, которая поможет разработчиками C# писать код на JavaScript используя принципы LINQ.

Ниже представлен простой массив объектов "person". Он будет использоваться далее для иллюстрации возможных подходв.

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 вожет быть эквивалентом выражения Where

var youngsters = people.filter(function (item) {
    return item.age < 30;
});

console.log("People younger than 30");

console.log(youngsters);


Использование функции map позволяет сделать то, для чего применяется Select

var names = people.map(function (item) {
    return item.name;
});

console.log("Just the names of people");

console.log(names);


Функцию every можно назвать эквивалентом All

var allUnder40 = people.every(function (item) {
    return item.age < 40;
});

console.log("Are all people under 40?"); // false

console.log(allUnder40);


Ниже представлено несколько эквивалентов Any

var anyUnder30 = people.some(function (item) {
    return item.age < 30;
});

console.log("Are any people under 30?");

console.log(anyUnder30); // true


Используйте фунцкию reduce для того что бы получить эквивалент Aggregate или Sum.

var aggregate = people.reduce(function (item1, item2) {
    return { name: '', age: item1.age + item2.age };
});

console.log("Aggregate age");

console.log(aggregate.age); // { age: 210 }


Функция sort может помочь получить эквивалент OrderBy, но в дополнение к этому она еще и массив отсортирует.

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

console.log("Ordered by name");

console.log(orderedByName);


Ну и разумеется вы можете выстраивать цепочки вызовов всех этих функций, точно также как и в LINQ.

var namesOfPeopleOver30OrderedDesc = people.filter(function (person) {
        return person.age > 30;
    }).
    map(function (person) {
        return person.name;
    }).
    sort(function (a, b) {
        return a < b ? 1 : 0;
    });

console.log("And now.. the names of all people over 30 ordered by name descending");

console.log(namesOfPeopleOver30OrderedDesc);

Разумеется LINQ предоставляет более гибкие, эффективные и более удобные возможности работы с коллекциями. Однако функции описанные в статье и подходы к их использованию – это прекрасный шанс писать такой же эффективный код и на JavaScript. Пусть синтаксис и отличается от привычного но LINQ, но возможности языка JavaScript даже на уровне базовых функцию позволяют использовать его в привычном стиле. Если вам этого показалось недостаточно, вы всегда можете обратиться с сторонним библотекам, которые предоставляют куда более цельные и унифицированные решения.
Так или иначе неразрешимых сложностей нет.

По мотивам публикации https://gist.github.com/DanDiplo/30528387da41332ff22b