Add _.toFinite.

This commit is contained in:
John-David Dalton
2016-05-04 21:09:28 -07:00
parent 73e7bab839
commit 9a461a5e48
2 changed files with 85 additions and 44 deletions

View File

@@ -1416,10 +1416,10 @@
* `floor`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, * `floor`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`,
* `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, `head`, `identity`, * `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, `head`, `identity`,
* `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, `isArray`, * `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, `isArray`,
* `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`, `isBuffer`, * `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`,
* `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`, `isError`, * `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`,
* `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`, `isMatch`, * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`,
* `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`, * `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`,
* `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, `isSafeInteger`, * `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, `isSafeInteger`,
* `isSet`, `isString`, `isUndefined`, `isTypedArray`, `isWeakMap`, `isWeakSet`, * `isSet`, `isString`, `isUndefined`, `isTypedArray`, `isWeakMap`, `isWeakSet`,
* `join`, `kebabCase`, `last`, `lastIndexOf`, `lowerCase`, `lowerFirst`, * `join`, `kebabCase`, `last`, `lastIndexOf`, `lowerCase`, `lowerFirst`,
@@ -1428,9 +1428,9 @@
* `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`, `round`, * `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`, `round`,
* `runInContext`, `sample`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, * `runInContext`, `sample`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`,
* `sortedIndexBy`, `sortedLastIndex`, `sortedLastIndexBy`, `startCase`, * `sortedIndexBy`, `sortedLastIndex`, `sortedLastIndexBy`, `startCase`,
* `startsWith`, `subtract`, `sum`, `sumBy`, `template`, `times`, `toInteger`, * `startsWith`, `subtract`, `sum`, `sumBy`, `template`, `times`, `toFinite`,
* `toJSON`, `toLength`, `toLower`, `toNumber`, `toSafeInteger`, `toString`, * `toInteger`, `toJSON`, `toLength`, `toLower`, `toNumber`, `toSafeInteger`,
* `toUpper`, `trim`, `trimEnd`, `trimStart`, `truncate`, `unescape`, * `toString`, `toUpper`, `trim`, `trimEnd`, `trimStart`, `truncate`, `unescape`,
* `uniqueId`, `upperCase`, `upperFirst`, `value`, and `words` * `uniqueId`, `upperCase`, `upperFirst`, `value`, and `words`
* *
* @name _ * @name _
@@ -10858,14 +10858,14 @@
* _.isFinite(3); * _.isFinite(3);
* // => true * // => true
* *
* _.isFinite(Number.MAX_VALUE); * _.isFinite(Number.MIN_VALUE);
* // => true
*
* _.isFinite(3.14);
* // => true * // => true
* *
* _.isFinite(Infinity); * _.isFinite(Infinity);
* // => false * // => false
*
* _.isFinite('3');
* // => false
*/ */
function isFinite(value) { function isFinite(value) {
return typeof value == 'number' && nativeIsFinite(value); return typeof value == 'number' && nativeIsFinite(value);
@@ -11586,6 +11586,41 @@
return func(value); return func(value);
} }
/**
* Converts `value` to a finite number.
*
* @static
* @memberOf _
* @since 4.12.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted number.
* @example
*
* _.toFinite(3.2);
* // => 3.2
*
* _.toFinite(Number.MIN_VALUE);
* // => 5e-324
*
* _.toFinite(Infinity);
* // => 1.7976931348623157e+308
*
* _.toFinite('3.2');
* // => 3.2
*/
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0;
}
value = toNumber(value);
if (value === INFINITY || value === -INFINITY) {
var sign = (value < 0 ? -1 : 1);
return sign * MAX_INTEGER;
}
return value === value ? value : 0;
}
/** /**
* Converts `value` to an integer. * Converts `value` to an integer.
* *
@@ -11600,7 +11635,7 @@
* @returns {number} Returns the converted integer. * @returns {number} Returns the converted integer.
* @example * @example
* *
* _.toInteger(3); * _.toInteger(3.2);
* // => 3 * // => 3
* *
* _.toInteger(Number.MIN_VALUE); * _.toInteger(Number.MIN_VALUE);
@@ -11609,20 +11644,14 @@
* _.toInteger(Infinity); * _.toInteger(Infinity);
* // => 1.7976931348623157e+308 * // => 1.7976931348623157e+308
* *
* _.toInteger('3'); * _.toInteger('3.2');
* // => 3 * // => 3
*/ */
function toInteger(value) { function toInteger(value) {
if (!value) { var result = toFinite(value),
return value === 0 ? value : 0; remainder = result % 1;
}
value = toNumber(value); return result === result ? (remainder ? result - remainder : result) : 0;
if (value === INFINITY || value === -INFINITY) {
var sign = (value < 0 ? -1 : 1);
return sign * MAX_INTEGER;
}
var remainder = value % 1;
return value === value ? (remainder ? value - remainder : value) : 0;
} }
/** /**
@@ -11640,7 +11669,7 @@
* @returns {number} Returns the converted integer. * @returns {number} Returns the converted integer.
* @example * @example
* *
* _.toLength(3); * _.toLength(3.2);
* // => 3 * // => 3
* *
* _.toLength(Number.MIN_VALUE); * _.toLength(Number.MIN_VALUE);
@@ -11649,7 +11678,7 @@
* _.toLength(Infinity); * _.toLength(Infinity);
* // => 4294967295 * // => 4294967295
* *
* _.toLength('3'); * _.toLength('3.2');
* // => 3 * // => 3
*/ */
function toLength(value) { function toLength(value) {
@@ -11667,8 +11696,8 @@
* @returns {number} Returns the number. * @returns {number} Returns the number.
* @example * @example
* *
* _.toNumber(3); * _.toNumber(3.2);
* // => 3 * // => 3.2
* *
* _.toNumber(Number.MIN_VALUE); * _.toNumber(Number.MIN_VALUE);
* // => 5e-324 * // => 5e-324
@@ -11676,8 +11705,8 @@
* _.toNumber(Infinity); * _.toNumber(Infinity);
* // => Infinity * // => Infinity
* *
* _.toNumber('3'); * _.toNumber('3.2');
* // => 3 * // => 3.2
*/ */
function toNumber(value) { function toNumber(value) {
if (typeof value == 'number') { if (typeof value == 'number') {
@@ -11740,7 +11769,7 @@
* @returns {number} Returns the converted integer. * @returns {number} Returns the converted integer.
* @example * @example
* *
* _.toSafeInteger(3); * _.toSafeInteger(3.2);
* // => 3 * // => 3
* *
* _.toSafeInteger(Number.MIN_VALUE); * _.toSafeInteger(Number.MIN_VALUE);
@@ -11749,7 +11778,7 @@
* _.toSafeInteger(Infinity); * _.toSafeInteger(Infinity);
* // => 9007199254740991 * // => 9007199254740991
* *
* _.toSafeInteger('3'); * _.toSafeInteger('3.2');
* // => 3 * // => 3
*/ */
function toSafeInteger(value) { function toSafeInteger(value) {
@@ -15915,6 +15944,7 @@
lodash.sumBy = sumBy; lodash.sumBy = sumBy;
lodash.template = template; lodash.template = template;
lodash.times = times; lodash.times = times;
lodash.toFinite = toFinite;
lodash.toInteger = toInteger; lodash.toInteger = toInteger;
lodash.toLength = toLength; lodash.toLength = toLength;
lodash.toLower = toLower; lodash.toLower = toLower;

View File

@@ -22994,7 +22994,7 @@
QUnit.module('number coercion methods'); QUnit.module('number coercion methods');
lodashStable.each(['toInteger', 'toNumber', 'toSafeInteger'], function(methodName) { lodashStable.each(['toFinite', 'toInteger', 'toNumber', 'toSafeInteger'], function(methodName) {
var func = _[methodName]; var func = _[methodName];
QUnit.test('`_.' + methodName + '` should preserve the sign of `0`', function(assert) { QUnit.test('`_.' + methodName + '` should preserve the sign of `0`', function(assert) {
@@ -23016,8 +23016,9 @@
}); });
}); });
lodashStable.each(['toInteger', 'toLength', 'toNumber', 'toSafeInteger'], function(methodName) { lodashStable.each(['toFinite', 'toInteger', 'toLength', 'toNumber', 'toSafeInteger'], function(methodName) {
var func = _[methodName], var func = _[methodName],
isToFinite = methodName == 'toFinite',
isToLength = methodName == 'toLength', isToLength = methodName == 'toLength',
isToNumber = methodName == 'toNumber', isToNumber = methodName == 'toNumber',
isToSafeInteger = methodName == 'toSafeInteger'; isToSafeInteger = methodName == 'toSafeInteger';
@@ -23055,7 +23056,7 @@
var expected = lodashStable.map(values, function(value) { var expected = lodashStable.map(values, function(value) {
if (!isToNumber) { if (!isToNumber) {
if (value == 1.2) { if (!isToFinite && value == 1.2) {
value = 1; value = 1;
} }
else if (value == Infinity) { else if (value == Infinity) {
@@ -23094,13 +23095,13 @@
var expected = lodashStable.map(values, function(value) { var expected = lodashStable.map(values, function(value) {
var n = +value; var n = +value;
if (!isToNumber) { if (!isToNumber) {
if (n == 1.234567890) { if (!isToFinite && n == 1.234567890) {
n = 1; n = 1;
} }
else if (n == Infinity) { else if (n == Infinity) {
n = MAX_INTEGER; n = MAX_INTEGER;
} }
else if (n == Number.MIN_VALUE || n !== n) { else if ((!isToFinite && n == Number.MIN_VALUE) || n !== n) {
n = 0; n = 0;
} }
if (isToLength || isToSafeInteger) { if (isToLength || isToSafeInteger) {
@@ -23216,20 +23217,29 @@
]; ];
var expected = [ var expected = [
NaN, 0, 1, NaN, NaN, 0, 1, NaN,
NaN, 2.2, 1.1, 1.1, NaN, 2.2, 1.1, 1.1,
NaN, NaN, NaN, NaN,
5349, 5349, 5349, 5349,
42, 42 42, 42
]; ];
if (!isToNumber) { if (isToFinite) {
expected = [ expected = [
0, 0, 1, 0, 0, 0, 1, 0,
0, 2, 1, 1, 0, 2.2, 1.1, 1.1,
0, 0, 0, 0,
5349, 5349, 5349, 5349,
42, 42 42, 42
];
}
else if (!isToNumber) {
expected = [
0, 0, 1, 0,
0, 2, 1, 1,
0, 0,
5349, 5349,
42, 42
]; ];
} }
var actual = lodashStable.map(values, func); var actual = lodashStable.map(values, func);
@@ -25946,6 +25956,7 @@
'startsWith', 'startsWith',
'subtract', 'subtract',
'sum', 'sum',
'toFinite',
'toInteger', 'toInteger',
'toLower', 'toLower',
'toNumber', 'toNumber',
@@ -26203,7 +26214,7 @@
var acceptFalsey = lodashStable.difference(allMethods, rejectFalsey); var acceptFalsey = lodashStable.difference(allMethods, rejectFalsey);
QUnit.test('should accept falsey arguments', function(assert) { QUnit.test('should accept falsey arguments', function(assert) {
assert.expect(308); assert.expect(309);
var emptyArrays = lodashStable.map(falsey, alwaysEmptyArray); var emptyArrays = lodashStable.map(falsey, alwaysEmptyArray);