Skip to content

Commit

Permalink
add Array find from last stage 1 proposal
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Feb 16, 2021
1 parent d3f70c7 commit 4e18c01
Show file tree
Hide file tree
Showing 34 changed files with 453 additions and 8 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
@@ -1,5 +1,10 @@
## Changelog
##### Unreleased
- Added [`Array` find from last stage 1 proposal](https://github.com/tc39/proposal-array-find-from-last)
- `Array#findLast`
- `Array#findLastIndex`
- `%TypedArray%#findLast`
- `%TypedArray%#findLastIndex`
- Dropped `ToLength` detection from array methods feature detection which could cause hanging FF11-21 and some versions of old WebKit, [#764](https://github.com/zloirock/core-js/issues/764)
- Minified bundle from `core-js-bundle` uses `terser` instead of `uglify-js`

Expand Down
43 changes: 38 additions & 5 deletions README.md
Expand Up @@ -2419,10 +2419,8 @@ class [
[*CommonJS entry points:*](#commonjs-api)
```
core-js/proposals/array-filtering
core-js(-pure)/features/array/filter-out
core-js(-pure)/features/array/virtual/filter-out
core-js(-pure)/features/array(/virtual)/filter-out
core-js(-pure)/features/typed-array/filter-out
core-js(-pure)/features/typed-array/virtual/filter-out
```
[*Examples*](http://es6.zloirock.ru/#log(%5B1%2C%202%2C%203%2C%204%2C%205%5D.filterOut(it%20%3D%3E%20it%20%25%202))%3B%20%2F%2F%20%3D%3E%20%5B2%2C%204%5D):
```js
Expand All @@ -2438,8 +2436,7 @@ class Array {
[*CommonJS entry points:*](#commonjs-api)
```
core-js/proposals/array-unique
core-js(-pure)/features/array/unique-by
core-js(-pure)/features/array/virtual/unique-by
core-js(-pure)/features/array(/virtual)/unique-by
```
[*Examples*](http://es6.zloirock.ru/#log(%5B1%2C%202%2C%203%2C%202%2C%201%5D.uniqueBy())%3B%20%20%2F%2F%20%5B1%2C%202%2C%203%5D%0A%0Aconst%20data%20%3D%20%5B%0A%20%20%7B%20id%3A%201%2C%20uid%3A%2010000%20%7D%2C%0A%20%20%7B%20id%3A%202%2C%20uid%3A%2010000%20%7D%2C%0A%20%20%7B%20id%3A%203%2C%20uid%3A%2010001%20%7D%0A%5D%3B%0A%0Alog(data.uniqueBy('uid'))%3B%20%2F%2F%20%3D%3E%20%5B%7B%20id%3A%201%2C%20uid%3A%2010000%20%7D%2C%20%7B%20id%3A%203%2C%20uid%3A%2010001%20%7D%5D%0A%0Alog(data.uniqueBy((%7B%20id%2C%20uid%20%7D)%20%3D%3E%20%60%24%7Bid%7D-%24%7Buid%7D%60))%3B%20%2F%2F%20%3D%3E%20%5B%7B%20id%3A%201%2C%20uid%3A%2010000%20%7D%2C%20%7B%20id%3A%202%2C%20uid%3A%2010000%20%7D%2C%20%7B%20id%3A%203%2C%20uid%3A%2010001%20%7D%5D):
```js
Expand All @@ -2451,6 +2448,42 @@ core-js(-pure)/features/array/virtual/unique-by
{ id: 3, uid: 10001 }
].uniqueBy(it => it.id); // => [{ id: 1, uid: 10000 }, { id: 3, uid: 10001 }]
```
##### [Array find from last](https://github.com/tc39/proposal-array-find-from-last)[⬆](#index)
Modules [`esnext.array.find-last`](https://github.com/zloirock/core-js/blob/v3.8.3/packages/core-js/modules/esnext.array.find-last.js), [`esnext.array.find-last-index`](https://github.com/zloirock/core-js/blob/v3.8.3/packages/core-js/modules/esnext.array.find-last-index.js), [`esnext.typed-array.find-last`](https://github.com/zloirock/core-js/blob/v3.8.3/packages/core-js/modules/esnext.typed-array.find-last.js) and [`esnext.typed-array.find-last-index`](https://github.com/zloirock/core-js/blob/v3.8.3/packages/core-js/modules/esnext.typed-array.find-last-index.js).
```js
class Array {
findLast(callbackfn: (value: any, index: number, target: any) => boolean, thisArg?: any): any;
findLastIndex(callbackfn: (value: any, index: number, target: any) => boolean, thisArg?: any): uint;
}
class [
Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
] {
findLast(callbackfn: (value: any, index: number, target: %TypedArray%) => boolean, thisArg?: any): any;
findLastIndex(callbackfn: (value: any, index: number, target: %TypedArray%) => boolean, thisArg?: any): uint;
}
```
[*CommonJS entry points:*](#commonjs-api)
```
core-js/proposals/array-find-from-last
core-js(-pure)/features(/virtual)/array/find-last
core-js(-pure)/features(/virtual)/array/find-last-index
core-js(-pure)/features/typed-array/find-last
core-js(-pure)/features/typed-array/find-last-index
```
[*Examples*](http://es6.zloirock.ru/#log(%5B1%2C%202%2C%203%2C%204%5D.findLast(it%20%3D%3E%20it%20%25%202))%3B%20%20%20%20%20%20%2F%2F%20%3D%3E%203%0Alog(%5B1%2C%202%2C%203%2C%204%5D.findLastIndex(it%20%3D%3E%20it%20%25%202))%3B%20%2F%2F%20%3D%3E%202):
```js
[1, 2, 3, 4].findLast(it => it % 2); // => 3
[1, 2, 3, 4].findLastIndex(it => it % 2); // => 2
````
#### Stage 0 proposals[⬆](#index)
[*CommonJS entry points:*](#commonjs-api)
Expand Down
8 changes: 8 additions & 0 deletions packages/core-js-compat/src/data.js
Expand Up @@ -1258,6 +1258,10 @@ const data = {
},
'esnext.array.filter-out': {
},
'esnext.array.find-last': {
},
'esnext.array.find-last-index': {
},
'esnext.array.is-template-object': {
},
'esnext.array.last-index': {
Expand Down Expand Up @@ -1498,6 +1502,10 @@ const data = {
},
'esnext.typed-array.filter-out': {
},
'esnext.typed-array.find-last': {
},
'esnext.typed-array.find-last-index': {
},
'esnext.weak-map.delete-all': {
},
'esnext.weak-map.from': {
Expand Down
6 changes: 6 additions & 0 deletions packages/core-js-compat/src/modules-by-versions.js
Expand Up @@ -73,4 +73,10 @@ module.exports = {
'esnext.typed-array.at',
'esnext.typed-array.filter-out',
],
3.9: [
'esnext.array.find-last',
'esnext.array.find-last-index',
'esnext.typed-array.find-last',
'esnext.typed-array.find-last-index',
],
};
@@ -0,0 +1 @@
// empty
@@ -0,0 +1 @@
// empty
4 changes: 4 additions & 0 deletions packages/core-js/features/array/find-last-index.js
@@ -0,0 +1,4 @@
require('../../modules/esnext.array.find-last-index');
var entryUnbind = require('../../internals/entry-unbind');

module.exports = entryUnbind('Array', 'findLastIndex');
4 changes: 4 additions & 0 deletions packages/core-js/features/array/find-last.js
@@ -0,0 +1,4 @@
require('../../modules/esnext.array.find-last');
var entryUnbind = require('../../internals/entry-unbind');

module.exports = entryUnbind('Array', 'findLast');
2 changes: 2 additions & 0 deletions packages/core-js/features/array/index.js
Expand Up @@ -2,6 +2,8 @@ var parent = require('../../es/array');
require('../../modules/es.map');
require('../../modules/esnext.array.at');
require('../../modules/esnext.array.filter-out');
require('../../modules/esnext.array.find-last');
require('../../modules/esnext.array.find-last-index');
require('../../modules/esnext.array.is-template-object');
require('../../modules/esnext.array.last-item');
require('../../modules/esnext.array.last-index');
Expand Down
4 changes: 4 additions & 0 deletions packages/core-js/features/array/virtual/find-last-index.js
@@ -0,0 +1,4 @@
require('../../../modules/esnext.array.find-last-index');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').findLastIndex;
4 changes: 4 additions & 0 deletions packages/core-js/features/array/virtual/find-last.js
@@ -0,0 +1,4 @@
require('../../../modules/esnext.array.find-last');
var entryVirtual = require('../../../internals/entry-virtual');

module.exports = entryVirtual('Array').findLast;
2 changes: 2 additions & 0 deletions packages/core-js/features/array/virtual/index.js
@@ -1,6 +1,8 @@
var parent = require('../../../es/array/virtual');
require('../../../modules/esnext.array.at');
require('../../../modules/esnext.array.filter-out');
require('../../../modules/esnext.array.find-last');
require('../../../modules/esnext.array.find-last-index');
require('../../../modules/esnext.array.unique-by');

module.exports = parent;
8 changes: 8 additions & 0 deletions packages/core-js/features/instance/find-last-index.js
@@ -0,0 +1,8 @@
var findLastIndex = require('../array/virtual/find-last-index');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
var own = it.findLastIndex;
return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.findLastIndex) ? findLastIndex : own;
};
8 changes: 8 additions & 0 deletions packages/core-js/features/instance/find-last.js
@@ -0,0 +1,8 @@
var findLast = require('../array/virtual/find-last');

var ArrayPrototype = Array.prototype;

module.exports = function (it) {
var own = it.findLast;
return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.findLast) ? findLast : own;
};
1 change: 1 addition & 0 deletions packages/core-js/features/typed-array/find-last-index.js
@@ -0,0 +1 @@
require('../../modules/esnext.typed-array.find-last-index');
1 change: 1 addition & 0 deletions packages/core-js/features/typed-array/find-last.js
@@ -0,0 +1 @@
require('../../modules/esnext.typed-array.find-last');
2 changes: 2 additions & 0 deletions packages/core-js/features/typed-array/index.js
@@ -1,5 +1,7 @@
var parent = require('../../es/typed-array');
require('../../modules/esnext.typed-array.at');
require('../../modules/esnext.typed-array.filter-out');
require('../../modules/esnext.typed-array.find-last');
require('../../modules/esnext.typed-array.find-last-index');

module.exports = parent;
34 changes: 34 additions & 0 deletions packages/core-js/internals/array-iteration-from-last.js
@@ -0,0 +1,34 @@
var bind = require('../internals/function-bind-context');
var IndexedObject = require('../internals/indexed-object');
var toObject = require('../internals/to-object');
var toLength = require('../internals/to-length');

// `Array.prototype.{ findLast, findLastIndex }` methods implementation
var createMethod = function (TYPE) {
var IS_FIND_INDEX = TYPE == 6;
return function ($this, callbackfn, that) {
var O = toObject($this);
var self = IndexedObject(O);
var boundFunction = bind(callbackfn, that, 3);
var index = toLength(self.length);
var value, result;
while (index-- > 0) {
value = self[index];
result = boundFunction(value, index, O);
if (result) switch (TYPE) {
case 5: return value; // find
case 6: return index; // findIndex
}
}
return IS_FIND_INDEX ? -1 : undefined;
};
};

module.exports = {
// `Array.prototype.findLast` method
// https://github.com/tc39/proposal-array-find-from-last
findLast: createMethod(5),
// `Array.prototype.findLastIndex` method
// https://github.com/tc39/proposal-array-find-from-last
findLastIndex: createMethod(6)
};
14 changes: 14 additions & 0 deletions packages/core-js/modules/esnext.array.find-last-index.js
@@ -0,0 +1,14 @@
'use strict';
var $ = require('../internals/export');
var $findLastIndex = require('../internals/array-iteration-from-last').findLastIndex;
var addToUnscopables = require('../internals/add-to-unscopables');

// `Array.prototype.findLastIndex` method
// https://github.com/tc39/proposal-array-find-from-last
$({ target: 'Array', proto: true }, {
findLastIndex: function findLastIndex(callbackfn /* , that = undefined */) {
return $findLastIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});

addToUnscopables('findLastIndex');
14 changes: 14 additions & 0 deletions packages/core-js/modules/esnext.array.find-last.js
@@ -0,0 +1,14 @@
'use strict';
var $ = require('../internals/export');
var $findLast = require('../internals/array-iteration-from-last').findLast;
var addToUnscopables = require('../internals/add-to-unscopables');

// `Array.prototype.findLast` method
// https://github.com/tc39/proposal-array-find-from-last
$({ target: 'Array', proto: true }, {
findLast: function findLast(callbackfn /* , that = undefined */) {
return $findLast(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});

addToUnscopables('findLast');
12 changes: 12 additions & 0 deletions packages/core-js/modules/esnext.typed-array.find-last-index.js
@@ -0,0 +1,12 @@
'use strict';
var ArrayBufferViewCore = require('../internals/array-buffer-view-core');
var $findLastIndex = require('../internals/array-iteration-from-last').findLastIndex;

var aTypedArray = ArrayBufferViewCore.aTypedArray;
var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;

// `%TypedArray%.prototype.findLastIndex` method
// https://github.com/tc39/proposal-array-find-from-last
exportTypedArrayMethod('findLastIndex', function findLastIndex(predicate /* , thisArg */) {
return $findLastIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
});
12 changes: 12 additions & 0 deletions packages/core-js/modules/esnext.typed-array.find-last.js
@@ -0,0 +1,12 @@
'use strict';
var ArrayBufferViewCore = require('../internals/array-buffer-view-core');
var $findLast = require('../internals/array-iteration-from-last').findLast;

var aTypedArray = ArrayBufferViewCore.aTypedArray;
var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;

// `%TypedArray%.prototype.findLast` method
// https://github.com/tc39/proposal-array-find-from-last
exportTypedArrayMethod('findLast', function findLast(predicate /* , thisArg */) {
return $findLast(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
});
5 changes: 5 additions & 0 deletions packages/core-js/proposals/array-find-from-last.js
@@ -0,0 +1,5 @@
// https://github.com/tc39/proposal-array-find-from-last/
require('../modules/esnext.array.find-last');
require('../modules/esnext.array.find-last-index');
require('../modules/esnext.typed-array.find-last');
require('../modules/esnext.typed-array.find-last-index');
1 change: 1 addition & 0 deletions packages/core-js/stage/1.js
@@ -1,4 +1,5 @@
require('../proposals/array-filtering');
require('../proposals/array-find-from-last');
require('../proposals/array-last');
require('../proposals/array-unique');
require('../proposals/collection-methods');
Expand Down
27 changes: 25 additions & 2 deletions tests/commonjs.js
Expand Up @@ -85,6 +85,8 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(load('features/array/fill')(Array(5), 2)[0] === 2);
ok(load('features/array/find')([2, 3, 4], it => it % 2) === 3);
ok(load('features/array/find-index')([2, 3, 4], it => it % 2) === 1);
ok(load('features/array/find-last')([1, 2, 3], it => it % 2) === 3);
ok(load('features/array/find-last-index')([1, 2, 3], it => it % 2) === 2);
ok('next' in load('features/array/keys')([]));
ok('next' in load('features/array/values')([]));
ok(load('features/array/includes')([1, 2, 3], 2));
Expand Down Expand Up @@ -114,6 +116,8 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(load('features/array/virtual/fill').call(Array(5), 2)[0] === 2);
ok(load('features/array/virtual/find').call([2, 3, 4], it => it % 2) === 3);
ok(load('features/array/virtual/find-index').call([2, 3, 4], it => it % 2) === 1);
ok(load('features/array/virtual/find-last').call([1, 2, 3], it => it % 2) === 3);
ok(load('features/array/virtual/find-last-index').call([1, 2, 3], it => it % 2) === 2);
ok('next' in load('features/array/virtual/keys').call([]));
ok('next' in load('features/array/virtual/values').call([]));
ok(load('features/array/virtual/includes').call([1, 2, 3], 2));
Expand Down Expand Up @@ -958,13 +962,19 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(typeof load('web/url') === 'function');
ok(typeof load('web/url-search-params') === 'function');
ok('setImmediate' in load('web'));
load('proposals/array-filtering');
load('proposals/array-find-from-last');
load('proposals/array-is-template-object');
load('proposals/array-last');
load('proposals/array-unique');
load('proposals/collection-methods');
load('proposals/collection-of-from');
load('proposals/efficient-64-bit-arithmetic');
load('proposals/global-this');
load('proposals/iterator-helpers');
load('proposals/keys-composition');
load('proposals/map-update-or-insert');
load('proposals/map-upsert');
load('proposals/math-extensions');
load('proposals/math-signbit');
load('proposals/number-from-string');
Expand All @@ -977,15 +987,14 @@ for (PATH of ['core-js-pure', 'core-js']) {
load('proposals/promise-try');
load('proposals/reflect-metadata');
load('proposals/relative-indexing-method');
load('proposals/keys-composition');
load('proposals/seeded-random');
load('proposals/set-methods');
load('proposals/string-at');
load('proposals/string-code-points');
load('proposals/string-match-all');
load('proposals/string-replace-all');
load('proposals/using-statement');
load('proposals/url');
load('proposals/using-statement');
load('proposals');
ok(load('stage/4'));
ok(load('stage/3'));
Expand Down Expand Up @@ -1192,6 +1201,18 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(typeof instanceFind([]) === 'function');
ok(instanceFind([]).call([1, 2, 3], it => it % 2) === 1);

const instanceFindLastIndex = load('features/instance/find-last-index');
ok(typeof instanceFindLastIndex === 'function');
ok(instanceFindLastIndex({}) === undefined);
ok(typeof instanceFindLastIndex([]) === 'function');
ok(instanceFindLastIndex([]).call([1, 2, 3], it => it % 2) === 2);

const instanceFindLast = load('features/instance/find-last');
ok(typeof instanceFindLast === 'function');
ok(instanceFindLast({}) === undefined);
ok(typeof instanceFindLast([]) === 'function');
ok(instanceFindLast([]).call([1, 2, 3], it => it % 2) === 3);

let instanceFlags = load('features/instance/flags');
ok(typeof instanceFlags === 'function');
ok(instanceFlags({}) === undefined);
Expand Down Expand Up @@ -1664,6 +1685,8 @@ load('features/typed-array/filter');
load('features/typed-array/filter-out');
load('features/typed-array/find');
load('features/typed-array/find-index');
load('features/typed-array/find-last');
load('features/typed-array/find-last-index');
load('features/typed-array/for-each');
load('features/typed-array/from');
load('features/typed-array/includes');
Expand Down
12 changes: 12 additions & 0 deletions tests/compat/tests.js
Expand Up @@ -1082,6 +1082,12 @@ GLOBAL.tests = {
'esnext.array.filter-out': function () {
return [].filterOut;
},
'esnext.array.find-last': function () {
return [].findLast;
},
'esnext.array.find-last-index': function () {
return [].findLastIndex;
},
'esnext.array.last-index': function () {
return [1, 2, 3].lastIndex && Array.prototype[Symbol.unscopables].lastIndex;
},
Expand Down Expand Up @@ -1425,6 +1431,12 @@ GLOBAL.tests = {
'esnext.typed-array.filter-out': function () {
return Int8Array.prototype.filterOut;
},
'esnext.typed-array.find-last': function () {
return Int8Array.prototype.findLast;
},
'esnext.typed-array.find-last-index': function () {
return Int8Array.prototype.findLastIndex;
},
'esnext.weak-map.delete-all': function () {
return WeakMap.prototype.deleteAll;
},
Expand Down

0 comments on commit 4e18c01

Please sign in to comment.