
Research
Security News
Malicious PyPI Package Exploits Deezer API for Coordinated Music Piracy
Socket researchers uncovered a malicious PyPI package exploiting Deezer’s API to enable coordinated music piracy through API abuse and C2 server control.
@aeinbu/groupby
Advanced tools
Lighweight and non-intrusive functions for doing "group by" type transformations on collections using reducers
Lightweight and non-intrusive functions for doing "group by" and "distinct" (aka. "unique") transformations on collections using reducers
.map(...)
, .filter(...)
and other built-in array functionsMap
.reduce(...)
on arrays.With npm
npm install @aeinbu/groupby
...or with yarn
yarn add @aeinbu/groupby
import { groupBy, toDictionary } from "@aeinbu/groupBy"
const people = [
{name: "Tony", residence: "Rome"},
{name: "Mary", residence: "Rome"},
{name: "Peter", residence: "London"},
{name: "Peter", residence: "Rome"},
{name: "Elisabeth", residence: "London"},
{name: "Francois", residence: "Paris"}
]
const resultsAsArray = people.reduce(
groupBy(
x => x.residence, // First lambda is used to extraxt the key values, so this will group by the residence
x => x.name // Second lambda to determine object values to put in the groups, so in this example the group will contain all names for people in a residence city
// This paramter is optional, and if it is skipped, the whole item is selected as the value
),
[]
)
// Result (Note how the output is a new array):
// [
// [key: "Rome", values: ["Tony", "Mary", "Peter"],
// ["Lkey: ondon", values: ["Peter", "Elisabeth"],
// ["key: Paris", values: ["Francois"]
// ]
const resultsAsDictionary = resultsAsArray.reduce(
toDictionary(
x => x.name, // First lambda to determine the property name
x => x.values // Second lambda to determine where to find the value to set that property to
// This paramter is optional, an if omitted it will default to `x => x.values´ which would match the default output of `groupBy` above
),
{}
)
// Result (See how the array is transformed to an object with properties for each key):
// {
// "Rome": ["Tony", "Mary", "Peter"],
// "London": ["Peter", "Elisabeth"],
// "Paris": ["Francois"]
// }
Since the reduction from groupBy
is an array, the above two transforms can be chained and shortened (using a default parameter in toDictionary), like this:
import { groupBy, toDictionary } from "@aeinbu/groupBy"
//...
const chainedResults = people
.reduce(groupBy(x => x.name, x => x.residence), [])
.reduce(toDictionary(x => x.name), {})
// With the same results as above:
// {
// "Rome": ["Tony", "Mary", "Peter"],
// "London": ["Peter", "Elisabeth"],
// "Paris": ["Francois"]
// }
There is also a toMap
reducer, so you can create a ES2015 Map
instead of an ordinary object:
import { groupBy, toMap } from "@aeinbu/groupBy"
//...
const chainedResults = people
.reduce(groupBy(x => x.name, x => x.residence), [])
.reduce(toMap(x => x.name), new Map())
// With the same results as above:
// {
// "Rome": ["Tony", "Mary", "Peter"],
// "London": ["Peter", "Elisabeth"],
// "Paris": ["Francois"]
// }
Also, look in the tests
directory for more examples. The tests demonstrate at least another dosen different ways to use this library
This package follows semantic versioning (See semver.org for more info)
This package is published under the MIT License. (See LICENSE file for more info)
FAQs
Lightweight and non-intrusive functions for doing "group by" type transformations on collections using reducers
We found that @aeinbu/groupby demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncovered a malicious PyPI package exploiting Deezer’s API to enable coordinated music piracy through API abuse and C2 server control.
Research
The Socket Research Team discovered a malicious npm package, '@ton-wallet/create', stealing cryptocurrency wallet keys from developers and users in the TON ecosystem.
Security News
Newly introduced telemetry in devenv 1.4 sparked a backlash over privacy concerns, leading to the removal of its AI-powered feature after strong community pushback.