From 3ebb38d389b9e4ce5b3ea4b2d2fcd3c405a10cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20Am=C3=A9rico?= Date: Sat, 24 Aug 2019 13:44:00 -0300 Subject: [PATCH] Coerce findLastIndex and lastIndexOf fromIndex parameter to integer (#4440) * Enable lastIndexOf, findLast and findLastIndex * Coerce findLastIndex fromIndex parameter to integer * Coerce lastIndexOf fromIndex parameter to integer --- findLastIndex.js | 6 ++++-- lastIndexOf.js | 2 ++ test/{findLast.js => findLast.test.js} | 0 ...dexOf.js => findLastIndex-and-lastIndexOf.test.js} | 11 +++++++++-- 4 files changed, 15 insertions(+), 4 deletions(-) rename test/{findLast.js => findLast.test.js} (100%) rename test/{findLastIndex-and-lastIndexOf.js => findLastIndex-and-lastIndexOf.test.js} (90%) diff --git a/findLastIndex.js b/findLastIndex.js index 98a358e02..f38fc082d 100644 --- a/findLastIndex.js +++ b/findLastIndex.js @@ -1,4 +1,5 @@ import baseFindIndex from './.internal/baseFindIndex.js' +import toInteger from './toInteger.js' /** * This method is like `findIndex` except that it iterates over elements @@ -29,9 +30,10 @@ function findLastIndex(array, predicate, fromIndex) { } let index = length - 1 if (fromIndex !== undefined) { + index = toInteger(fromIndex) index = fromIndex < 0 - ? Math.max(length + fromIndex, 0) - : Math.min(fromIndex, length - 1) + ? Math.max(length + index, 0) + : Math.min(index, length - 1) } return baseFindIndex(array, predicate, index, true) } diff --git a/lastIndexOf.js b/lastIndexOf.js index e5894f4fb..23f3a76e7 100644 --- a/lastIndexOf.js +++ b/lastIndexOf.js @@ -1,6 +1,7 @@ import baseFindIndex from './.internal/baseFindIndex.js' import baseIsNaN from './.internal/baseIsNaN.js' import strictLastIndexOf from './.internal/strictLastIndexOf.js' +import toInteger from './toInteger.js' /** * This method is like `indexOf` except that it iterates over elements of @@ -28,6 +29,7 @@ function lastIndexOf(array, value, fromIndex) { } let index = length if (fromIndex !== undefined) { + index = toInteger(fromIndex) index = index < 0 ? Math.max(length + index, 0) : Math.min(index, length - 1) } return value === value diff --git a/test/findLast.js b/test/findLast.test.js similarity index 100% rename from test/findLast.js rename to test/findLast.test.js diff --git a/test/findLastIndex-and-lastIndexOf.js b/test/findLastIndex-and-lastIndexOf.test.js similarity index 90% rename from test/findLastIndex-and-lastIndexOf.js rename to test/findLastIndex-and-lastIndexOf.test.js index 44744bb99..e28803e39 100644 --- a/test/findLastIndex-and-lastIndexOf.js +++ b/test/findLastIndex-and-lastIndexOf.test.js @@ -1,11 +1,18 @@ import assert from 'assert'; import lodashStable from 'lodash'; -import { _, identity, stubZero, falsey } from './utils.js'; +import { identity, stubZero, falsey } from './utils.js'; +import findLastIndex from '../findLastIndex.js'; +import lastIndexOf from '../lastIndexOf.js'; + +const methods = { + findLastIndex, + lastIndexOf +}; describe('findLastIndex and lastIndexOf', function() { lodashStable.each(['findLastIndex', 'lastIndexOf'], function(methodName) { var array = [1, 2, 3, 1, 2, 3], - func = _[methodName], + func = methods[methodName], resolve = methodName == 'findLastIndex' ? lodashStable.curry(lodashStable.eq) : identity; it('`_.' + methodName + '` should return the index of the last matched value', function() {