npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@steelbreeze/pivot

v4.3.0

Published

Minimal TypeScript / JavaScript n-cube library

Downloads

118

Readme

pivot

Maintainability

A minimalist pivot table library for TypeScript/JavaScript. While small (a mere 485 bytes when minified), this library is large in capability, supporting derived and custom dimensions, derived fields for dimensions and calculations, composite dimensions, filtering.

The library also provides a modest set of numerical selectors. Suggestions for additions, or better still contributions, are welcome.

Why create another pivot table library?

There are plenty of pivot table libraries in existence, so why create another one? Well, this is a spin-off from the steelbreeze/landscape project, where instead of aggregating numerical data from the pivot cube, non-numerical data is needed.

It also focuses just on dimension and cube creation, without any layout considerations keeping it small and unopinionated.

n-cubes

The libary allows 1-n dimensions to be passed into the pivot function allowing n-cube (or hypercube) generation.

Installation

NPM

For installation via the node package manager:

npm i @steelbreeze/pivot

Web

For web via a CDN:

import * as pivot from 'https://cdn.skypack.dev/@steelbreeze/pivot';

Documentation

The documentation can be found here, and more discussion in the Wiki.

Example

The following is the result of pivoting publicly available information about the Fulham Football Club men's squad at the end of the 2020/21 season, calculating the average age of players by position and country.

import { distinct, criteria, pivot, map, average } from '@steelbreeze/pivot';
import { squad } from './fulham';

// the position dimension we want in a custom order
const positions = ['Goalkeeper', 'Defender', 'Midfielder', 'Forward'];

// the countries dimension we derive from the data and order alphabetically
const countries = squad.map(player => player.country).filter(distinct).sort();

// we then create dimensions which also reference a property in the source data 
const x = positions.map(criteria('position'));
const y = countries.map(criteria('country'));

// create the pivot cube from the squad data using position and country for x and y axes
let cube = pivot(squad, y, x);

// find the average age of players by position by country as at 2021-05-23
const result = map(cube, average(age(new Date('2021-05-23'))));

The full example can be found here.

The selection is the average age of the players grouped by position and country:

        Goalke… Defend… Midfie… Forward
Belgium         32
Camero…                 25
Denmark         24
England         25      23.25   23
France  28      27
Gabon                   27
Jamaica         28              28
Nether…         25
Nigeria         24              22
Portug…                         27
Scotla…                 31
Serbia                          26
Slovak… 24
Spain   33
USA             28

The full example code can be found here.

Alternatively, as can be seen in the web example, non-numerical content can also be queried, mapping the source data to an arbitrary selection:

const result = pivot.map(cube, pivot.select(player => `${player.givenName} ${player.familyName}`));

Resulting in this sort of output: ||Goalkeeper|Defender|Midfielder|Forward| |-|-|-|-|-| |Belgium||Denis Odoi||| |Cameroon|||Andre-Frank Zambo Anguissa|| |Denmark||Joachim Anderson|| |England||Tosin Abarabioyo, Joe Bryan|Ruben Loftus-Cheek, Harrison Reed, Josh Onomah, Fabio Carvalho|Ademola Lookman| |France|Alphonse Areola|Terence Kongolo|| |Gabon|||Mario Lemina|| |Jamaica||Michael Hector||Bobby De Cordova-Reid| |Netherlands||Kenny Tete|| |Nigeria||Ola Aina||Josh Maja| |Portugal||||Ivan Cavaleiro| |Scotland|||Kevin McDonald, Tom Cairney|| |Serbia||||Aleksander Mitrovic| |Slovakia|Marek Rodak|||| |Spain|Fabrico Agosto Ramirez|||| |USA||Tim Ream, Antonee Robinson|||

Data and calculations correct as of: 2021-05-23.