0.0.3 • Published 2 years ago

array-grouping-polyfill v0.0.3

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Polyfill for tc39/proposal-array-grouping

Simple polyfill for tc39/proposal-array-grouping, if you dont feel like including core-js

How to use

import 'array-grouping-polyfill'


const array = [-1, 2, -4, 5, 'foo', 0, 6, 3, -3, 5];
const {negative, positive, zero, nan} = array.groupBy((i) => {
    switch(true) {
        case typeof i !== 'number':
            return 'nan';
        case i < 0:
            return 'negative'
        case i > 0:
            return 'positive'
        default:
            return 'zero';
    }
});


console.log(negative) // -1, -4, -3
console.log(positive) // 2, 5, 6, 3, 5
console.log(zero) // 0
console.log(nan) // foo

proposal-array-grouping

(Note this is a copy from tc39/proposal-array-grouping)

A proposal to make grouping of items in an array easier.

const array = [1, 2, 3, 4, 5];

// groupBy groups items by arbitrary key.
// In this case, we're grouping by even/odd keys
array.groupBy((num, index, array) => {
  return num % 2 === 0 ? 'even': 'odd';
});

// =>  { odd: [1, 3, 5], even: [2, 4] }

// groupByToMap returns items in a Map, and is useful for grouping using
// an object key.
const odd  = { odd: true };
const even = { even: true };
array.groupByToMap((num, index, array) => {
  return num % 2 === 0 ? even: odd;
});

// =>  Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }

Array grouping is an extremely common operation, best exemplified by SQL's GROUP BY clause and MapReduce programming (which is better thought of map-group-reduce). The ability to combine like data into groups allows developers to compute higher order datasets, like the average age of a cohort or daily LCP values for a webpage.

Two methods are offered, groupBy and groupByToMap. The first returns a null-prototype object, which allows ergonomic destructuring and prevents accidental collisions with global Object properties. The second returns a regular Map instance, which allows grouping on complex key types (imagine a compound key or tuple).

Transpiled standalone code

Just want to use a small blob of code that is stand alone?

void (function() {
    var _a, _b;
    var _c, _d;
    (_a = (_c = Array.prototype).groupBy) !== null && _a !== void 0 ? _a : (_c.groupBy = function (callback, thisArg) {
        var obj = {};
        this.forEach(function (value, idx, self) {
            var _a;
            var ret = thisArg ? callback.call(thisArg, value, idx, self) : callback(value, idx, self);
            ((_a = obj[ret]) !== null && _a !== void 0 ? _a : (obj[ret] = [])).push(value);
        });
        return obj;
    });
    (_b = (_d = Array.prototype).groupByToMap) !== null && _b !== void 0 ? _b : (_d.groupByToMap = function (callback, thisArg) {
        var map = new Map();
        this.forEach(function (value, idx, self) {
            var ret = thisArg ? callback.call(thisArg, value, idx, self) : callback(value, idx, self);
            var group = map.get(ret) || [];
            if (group.push(value) === 1)
                map.set(ret, group);
        });
        return map;
    });
})()