Skip to content

Commit e3a7cac

Browse files
committed
Array grouping proposal changes
1 parent a91940f commit e3a7cac

File tree

17 files changed

+167
-57
lines changed

17 files changed

+167
-57
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
- `String.prototype.toWellFormed` method
77
- Moved to stable ES, [May 2023 TC39 meeting](https://github.com/tc39/proposal-is-usv-string/pull/31)
88
- Added `es.` namespace modules, `/es/` and `/stable/` namespaces entries
9+
- [`Array` grouping proposal](https://github.com/tc39/proposal-array-grouping):
10+
- Because of the [web compat issue](https://github.com/tc39/proposal-array-grouping/issues/44), [moved from prototype to static methods](https://github.com/tc39/proposal-array-grouping/pull/47), [May 2023 TC39 meeting](https://github.com/babel/proposals/issues/88#issuecomment-1553350818). Added:
11+
- `Object.groupBy`
12+
- `Map.groupBy`
13+
- Demoted to stage 2
914
- [Decorator Metadata proposal](https://github.com/tc39/proposal-decorator-metadata):
1015
- Moved to Stage 3, [May 2023 TC39 meeting](https://github.com/babel/proposals/issues/88#issuecomment-1553366034)
1116
- Added `Function.prototype[Symbol.metadata]` (`=== null`), [May 2023 TC39 meeting](https://github.com/babel/proposals/issues/88#issuecomment-1550313363)
@@ -23,7 +28,7 @@
2328
- Fixed awaiting async `AsyncDisposableStack.prototype.adopt` callback, [#1258](https://github.com/zloirock/core-js/issues/1258)
2429
- Compat data improvements:
2530
- `Set.prototype.difference` that was missed in Bun because of [a bug](https://github.com/oven-sh/bun/issues/2309) added in 0.6.0
26-
- `Array.prototype.{ group, groupToMap }` are disabled from Bun 0.6.2 because of [web compat issues](https://github.com/tc39/proposal-array-grouping/issues/44)
31+
- `Array.prototype.{ group, groupToMap }` marked as no longer supported in WebKit runtimes because of the mentioned above web compat issue. For example, it's disabled from Bun 0.6.2
2732
- Added Deno 1.34 compat data mapping
2833
- Added Electron 26 compat data mapping
2934
- Added Samsung Internet 22 compat data mapping

README.md

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2238,28 +2238,6 @@ core-js(-pure)/full/array/from-async
22382238
```js
22392239
await Array.fromAsync((async function * (){ yield * [1, 2, 3] })(), i => i * i); // => [1, 4, 9]
22402240
```
2241-
##### [`Array` grouping](https://github.com/tc39/proposal-array-grouping)[⬆](#index)
2242-
Modules [`esnext.array.group`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.array.group.js), [`esnext.array.group-to-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.array.group-to-map.js).
2243-
```js
2244-
class Array {
2245-
group(callbackfn: (value: any, index: number, target: any) => key, thisArg?: any): { [key]: Array<mixed> };
2246-
groupToMap(callbackfn: (value: any, index: number, target: any) => key, thisArg?: any): Map<key, Array<mixed>>;
2247-
}
2248-
```
2249-
[*CommonJS entry points:*](#commonjs-api)
2250-
```
2251-
core-js/proposals/array-grouping-stage-3-2
2252-
core-js(-pure)/actual|full/array(/virtual)/group
2253-
core-js(-pure)/actual|full/array(/virtual)/group-to-map
2254-
```
2255-
[*Examples*](https://is.gd/3a0PbH):
2256-
```js
2257-
[1, 2, 3, 4, 5].group(it => it % 2); // => { 1: [1, 3, 5], 0: [2, 4] }
2258-
2259-
const map = [1, 2, 3, 4, 5].groupToMap(it => it % 2);
2260-
map.get(1); // => [1, 3, 5]
2261-
map.get(0); // => [2, 4]
2262-
````
22632241
##### [New `Set` methods](https://github.com/tc39/proposal-set-methods)[⬆](#index)
22642242
Modules [`esnext.set.difference.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.difference.v2.js), [`esnext.set.intersection.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.intersection.v2.js), [`esnext.set.is-disjoint-from.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-disjoint-from.v2.js), [`esnext.set.is-subset-of.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-subset-of.v2.js), [`esnext.set.is-superset-of.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.is-superset-of.v2.js), [`esnext.set.symmetric-difference.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.symmetric-difference.v2.js), [`esnext.set.union.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.set.union.v2.js)
22652243
```js
@@ -2425,6 +2403,31 @@ core-js(-pure)/actual|full/function/metadata
24252403
```
24262404
core-js(-pure)/stage/2
24272405
```
2406+
##### [`Array` grouping](https://github.com/tc39/proposal-array-grouping)[⬆](#index)
2407+
Modules [`esnext.object.group-by`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.object.group-by.js), [`esnext.map.group-by`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.map.group-by.js).
2408+
```js
2409+
class Object {
2410+
groupBy(items: Iterable, callbackfn: (value: any, index: number) => key): { [key]: Array<mixed> };
2411+
}
2412+
2413+
class Map {
2414+
groupBy(items: Iterable, callbackfn: (value: any, index: number) => key): Map<key, Array<mixed>>;
2415+
}
2416+
```
2417+
[*CommonJS entry points:*](#commonjs-api)
2418+
```
2419+
core-js/proposals/array-grouping-v2
2420+
core-js(-pure)/full/map/group-by
2421+
core-js(-pure)/full/object/group-by
2422+
```
2423+
[*Examples*](https://is.gd/3a0PbH):
2424+
```js
2425+
Object.groupBy([1, 2, 3, 4, 5], it => it % 2); // => { 1: [1, 3, 5], 0: [2, 4] }
2426+
2427+
const map = Map.groupBy([1, 2, 3, 4, 5], it => it % 2);
2428+
map.get(1); // => [1, 3, 5]
2429+
map.get(0); // => [2, 4]
2430+
````
24282431
##### [`AsyncIterator` helpers](https://github.com/tc39/proposal-async-iterator-helpers)[⬆](#index)
24292432
Modules [`esnext.async-iterator.constructor`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.constructor.js), [`esnext.async-iterator.drop`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.drop.js), [`esnext.async-iterator.every`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.every.js), [`esnext.async-iterator.filter`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.filter.js), [`esnext.async-iterator.find`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.find.js), [`esnext.async-iterator.flat-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.flat-map.js), [`esnext.async-iterator.for-each`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.for-each.js), [`esnext.async-iterator.from`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.from.js), [`esnext.async-iterator.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.map.js), [`esnext.async-iterator.reduce`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.reduce.js), [`esnext.async-iterator.some`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.some.js), [`esnext.async-iterator.take`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.take.js), [`esnext.async-iterator.to-array`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.async-iterator.to-array.js), , [`esnext.iterator.to-async`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.to-async.js)
24302433
```js

packages/core-js-compat/src/data.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,7 +1878,7 @@ export const data = {
18781878
// bun: '0.1.9',
18791879
// https://github.com/tc39/proposal-array-grouping/issues/44#issuecomment-1306311107
18801880
// chrome: '108',
1881-
safari: '16.4',
1881+
// safari: '16.4',
18821882
},
18831883
// TODO: Remove from `core-js@4`
18841884
'esnext.array.group-by': {
@@ -1891,7 +1891,7 @@ export const data = {
18911891
// bun: '0.1.9',
18921892
// https://github.com/tc39/proposal-array-grouping/issues/44#issuecomment-1306311107
18931893
// chrome: '108',
1894-
safari: '16.4',
1894+
// safari: '16.4',
18951895
},
18961896
'esnext.array.is-template-object': {
18971897
},
@@ -2112,6 +2112,8 @@ export const data = {
21122112
// TODO: Remove from `core-js@4`
21132113
'esnext.object.iterate-values': {
21142114
},
2115+
'esnext.object.group-by': {
2116+
},
21152117
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
21162118
'esnext.observable': {
21172119
},

packages/core-js-compat/src/modules-by-versions.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ export default {
206206
'es.string.is-well-formed',
207207
'es.string.to-well-formed',
208208
'esnext.function.metadata',
209+
'esnext.object.group-by',
209210
'esnext.promise.with-resolvers',
210211
'esnext.symbol.is-registered-symbol',
211212
'esnext.symbol.is-well-known-symbol',
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
require('../../modules/es.object.create');
2+
require('../../modules/esnext.object.group-by');
3+
4+
var path = require('../../internals/path');
5+
6+
module.exports = path.Object.groupBy;

packages/core-js/full/object/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var parent = require('../../actual/object');
2+
require('../../modules/esnext.object.group-by');
23
// TODO: Remove from `core-js@4`
34
require('../../modules/esnext.object.has-own');
45
require('../../modules/esnext.object.iterate-entries');
Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
'use strict';
22
var $ = require('../internals/export');
3-
var call = require('../internals/function-call');
43
var uncurryThis = require('../internals/function-uncurry-this');
5-
var isCallable = require('../internals/is-callable');
64
var aCallable = require('../internals/a-callable');
5+
var requireObjectCoercible = require('../internals/require-object-coercible');
76
var iterate = require('../internals/iterate');
8-
var Map = require('../internals/map-helpers').Map;
7+
var MapHelpers = require('../internals/map-helpers');
98

9+
var Map = MapHelpers.Map;
10+
var has = MapHelpers.has;
11+
var get = MapHelpers.get;
12+
var set = MapHelpers.set;
1013
var push = uncurryThis([].push);
1114

1215
// `Map.groupBy` method
13-
// https://github.com/tc39/proposal-collection-methods
16+
// https://github.com/tc39/proposal-array-grouping
1417
$({ target: 'Map', stat: true, forced: true }, {
15-
groupBy: function groupBy(iterable, keyDerivative) {
16-
var C = isCallable(this) ? this : Map;
17-
var newMap = new C();
18-
aCallable(keyDerivative);
19-
var has = aCallable(newMap.has);
20-
var get = aCallable(newMap.get);
21-
var set = aCallable(newMap.set);
22-
iterate(iterable, function (element) {
23-
var derivedKey = keyDerivative(element);
24-
if (!call(has, newMap, derivedKey)) call(set, newMap, derivedKey, [element]);
25-
else push(call(get, newMap, derivedKey), element);
18+
groupBy: function groupBy(items, callbackfn) {
19+
requireObjectCoercible(items);
20+
aCallable(callbackfn);
21+
var map = new Map();
22+
var k = 0;
23+
iterate(items, function (value) {
24+
var key = callbackfn(value, k++);
25+
if (!has(map, key)) set(map, key, [value]);
26+
else push(get(map, key), value);
2627
});
27-
return newMap;
28+
return map;
2829
}
2930
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'use strict';
2+
var $ = require('../internals/export');
3+
var getBuiltIn = require('../internals/get-built-in');
4+
var uncurryThis = require('../internals/function-uncurry-this');
5+
var aCallable = require('../internals/a-callable');
6+
var requireObjectCoercible = require('../internals/require-object-coercible');
7+
var has = require('../internals/has-own-property');
8+
var toPropertyKey = require('../internals/to-property-key');
9+
var iterate = require('../internals/iterate');
10+
11+
var create = getBuiltIn('Object', 'create');
12+
var push = uncurryThis([].push);
13+
14+
// `Object.groupBy` method
15+
// https://github.com/tc39/proposal-array-grouping
16+
$({ target: 'Object', stat: true, forced: true }, {
17+
groupBy: function groupBy(items, callbackfn) {
18+
requireObjectCoercible(items);
19+
aCallable(callbackfn);
20+
var obj = create(null);
21+
var k = 0;
22+
iterate(items, function (value) {
23+
var key = toPropertyKey(callbackfn(value, k++));
24+
if (!has(obj, key)) obj[key] = [value];
25+
else push(obj[key], value);
26+
});
27+
return obj;
28+
}
29+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// https://github.com/tc39/proposal-array-grouping
2+
require('../modules/esnext.map.group-by');
3+
require('../modules/esnext.object.group-by');

packages/core-js/stage/2.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var parent = require('./3');
22

3+
require('../proposals/array-grouping-v2');
34
require('../proposals/array-is-template-object');
45
require('../proposals/async-explicit-resource-management');
56
require('../proposals/async-iterator-helpers');

packages/core-js/stage/3.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var parent = require('./4');
22

33
require('../proposals/array-from-async-stage-2');
4-
require('../proposals/array-grouping-stage-3-2');
54
require('../proposals/array-buffer-transfer');
65
require('../proposals/decorator-metadata-v2');
76
require('../proposals/explicit-resource-management');
@@ -10,6 +9,7 @@ require('../proposals/json-parse-with-source');
109
require('../proposals/set-methods-v2');
1110
// TODO: Obsolete versions, remove from `core-js@4`
1211
require('../proposals/array-grouping-stage-3');
12+
require('../proposals/array-grouping-stage-3-2');
1313
require('../proposals/change-array-by-copy');
1414
require('../proposals/iterator-helpers-stage-3');
1515

tests/compat/tests.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,6 +1690,9 @@ GLOBAL.tests = {
16901690
'esnext.number.from-string': function () {
16911691
return Number.fromString;
16921692
},
1693+
'esnext.object.group-by': function () {
1694+
return Object.groupBy;
1695+
},
16931696
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
16941697
'esnext.observable': function () {
16951698
return Observable;

tests/entries/unit.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
797797
ok(typeof load(NS, 'object/iterate-entries')({}).next == 'function');
798798
ok(typeof load(NS, 'object/iterate-keys')({}).next == 'function');
799799
ok(typeof load(NS, 'object/iterate-values')({}).next == 'function');
800+
ok(load(NS, 'object/group-by')([1, 2, 3, 4, 5], it => it % 2 === 0 ? 'even' : 'odd').odd.length === 3);
800801
ok('from' in load(NS, 'observable'));
801802
ok(typeof load(NS, 'reflect/define-metadata') == 'function');
802803
ok(typeof load(NS, 'reflect/delete-metadata') == 'function');
@@ -896,6 +897,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
896897
load('proposals/array-grouping');
897898
load('proposals/array-grouping-stage-3');
898899
load('proposals/array-grouping-stage-3-2');
900+
load('proposals/array-grouping-v2');
899901
load('proposals/array-includes');
900902
load('proposals/array-is-template-object');
901903
load('proposals/array-last');

tests/unit-global/esnext.map.group-by.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ QUnit.test('Map.groupBy', assert => {
1212

1313
assert.true(Map.groupBy([], it => it) instanceof Map);
1414

15-
assert.deepEqual(toArray(Map.groupBy([], it => it)), []);
16-
assert.deepEqual(toArray(Map.groupBy([1, 2], it => it ** 2)), [[1, [1]], [4, [2]]]);
17-
assert.deepEqual(toArray(Map.groupBy([1, 2, 1], it => it ** 2)), [[1, [1, 1]], [4, [2]]]);
18-
assert.deepEqual(toArray(Map.groupBy(createIterable([1, 2]), it => it ** 2)), [[1, [1]], [4, [2]]]);
15+
assert.deepEqual(toArray(groupBy([], it => it)), []);
16+
assert.deepEqual(toArray(groupBy([1, 2], it => it ** 2)), [[1, [1]], [4, [2]]]);
17+
assert.deepEqual(toArray(groupBy([1, 2, 1], it => it ** 2)), [[1, [1, 1]], [4, [2]]]);
18+
assert.deepEqual(toArray(groupBy(createIterable([1, 2]), it => it ** 2)), [[1, [1]], [4, [2]]]);
1919

2020
const element = {};
21-
Map.groupBy([element], it => assert.same(it, element));
22-
23-
// assert.throws(() => groupBy([1, 2], it => it));
21+
groupBy([element], function (it, i) {
22+
assert.same(arguments.length, 2);
23+
assert.same(it, element);
24+
assert.same(i, 0);
25+
});
2426
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { createIterable } from '../helpers/helpers';
2+
3+
QUnit.test('Object.groupBy', assert => {
4+
const { groupBy, getPrototypeOf, entries } = Object;
5+
6+
assert.isFunction(groupBy);
7+
assert.arity(groupBy, 2);
8+
assert.name(groupBy, 'groupBy');
9+
assert.looksNative(groupBy);
10+
assert.nonEnumerable(Object, 'groupBy');
11+
12+
assert.same(getPrototypeOf(groupBy([], it => it)), null);
13+
14+
assert.deepEqual(entries(groupBy([], it => it)), []);
15+
assert.deepEqual(entries(groupBy([1, 2], it => it ** 2)), [['1', [1]], ['4', [2]]]);
16+
assert.deepEqual(entries(groupBy([1, 2, 1], it => it ** 2)), [['1', [1, 1]], ['4', [2]]]);
17+
assert.deepEqual(entries(groupBy(createIterable([1, 2]), it => it ** 2)), [['1', [1]], ['4', [2]]]);
18+
19+
const element = {};
20+
groupBy([element], function (it, i) {
21+
assert.same(arguments.length, 2);
22+
assert.same(it, element);
23+
assert.same(i, 0);
24+
});
25+
});

tests/unit-pure/esnext.map.group-by.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@ QUnit.test('Map.groupBy', assert => {
1010
assert.arity(groupBy, 2);
1111
assert.name(groupBy, 'groupBy');
1212

13-
assert.true(Map.groupBy([], it => it) instanceof Map);
13+
assert.true(groupBy([], it => it) instanceof Map);
1414

15-
assert.deepEqual(from(Map.groupBy([], it => it)), []);
16-
assert.deepEqual(from(Map.groupBy([1, 2], it => it ** 2)), [[1, [1]], [4, [2]]]);
17-
assert.deepEqual(from(Map.groupBy([1, 2, 1], it => it ** 2)), [[1, [1, 1]], [4, [2]]]);
18-
assert.deepEqual(from(Map.groupBy(createIterable([1, 2]), it => it ** 2)), [[1, [1]], [4, [2]]]);
15+
assert.deepEqual(from(groupBy([], it => it)), []);
16+
assert.deepEqual(from(groupBy([1, 2], it => it ** 2)), [[1, [1]], [4, [2]]]);
17+
assert.deepEqual(from(groupBy([1, 2, 1], it => it ** 2)), [[1, [1, 1]], [4, [2]]]);
18+
assert.deepEqual(from(groupBy(createIterable([1, 2]), it => it ** 2)), [[1, [1]], [4, [2]]]);
1919

2020
const element = {};
21-
Map.groupBy([element], it => assert.same(it, element));
22-
23-
// assert.throws(() => groupBy([1, 2], it => it));
21+
groupBy([element], function (it, i) {
22+
assert.same(arguments.length, 2);
23+
assert.same(it, element);
24+
assert.same(i, 0);
25+
});
2426
});
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { createIterable } from '../helpers/helpers';
2+
import groupBy from 'core-js-pure/full/object/group-by';
3+
import getPrototypeOf from 'core-js-pure/es/object/get-prototype-of';
4+
import entries from 'core-js-pure/es/object/entries';
5+
6+
QUnit.test('Object.groupBy', assert => {
7+
assert.isFunction(groupBy);
8+
assert.arity(groupBy, 2);
9+
assert.name(groupBy, 'groupBy');
10+
11+
assert.same(getPrototypeOf(groupBy([], it => it)), null);
12+
13+
assert.deepEqual(entries(groupBy([], it => it)), []);
14+
assert.deepEqual(entries(groupBy([1, 2], it => it ** 2)), [['1', [1]], ['4', [2]]]);
15+
assert.deepEqual(entries(groupBy([1, 2, 1], it => it ** 2)), [['1', [1, 1]], ['4', [2]]]);
16+
assert.deepEqual(entries(groupBy(createIterable([1, 2]), it => it ** 2)), [['1', [1]], ['4', [2]]]);
17+
18+
const element = {};
19+
groupBy([element], function (it, i) {
20+
assert.same(arguments.length, 2);
21+
assert.same(it, element);
22+
assert.same(i, 0);
23+
});
24+
});

0 commit comments

Comments
 (0)