lodash-4 fill,toInteger

211 阅读2分钟

前言

今天是 lodash 第四期,带来的函数是 fill 比较简单的一个方法

Api

_.fill(array, value, [start=0], [end=array.length])

source npm package

Fills elements of array with value from start up to, but not including, end.

Note:  This method mutates array. 这个方法会改变原数组

Arguments

  1. array  (Array) : The array to fill.
  2. value  (*) : The value to fill array with.
  3. [start=0]  (number) : The start position.
  4. [end=array.length]  (number) : The end position.

Returns

(Array) : Returns array.

Example

var array = [123];
 
_.fill(array, 'a');
console.log(array);
// => ['a', 'a', 'a']
 
_.fill(Array(3), 2);
// => [2, 2, 2]
 
_.fill([46810], '*'13);
// => [4, '*', '*', 10]

source

function fill(array, value, start, end) {

  var length = array == null ? 0 : array.length;
  
  if (!length) {
    return [];
  }
    
   // 如果 start 传递了非数字类型的值,转化为 0
  if (start && typeof start != 'number') {
    start = 0;
    end = length;
  }
  
  return baseFill(array, value, start, end);
}

baseFill

baseFill 接收四个参数,分别是 要填充的数组 array,要填充的值 value,填充的开始值 start,填充的结束值 end

function baseFill(array, value, start, end) {

  var length = array.length;
  
  // 如果 不存在 start值,初始化为 0
  if(start == undefined) start = 0;

  // 如果是 负数,可能是想从右往左查找
  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }

  // end 可能不存在
  // 如果不存在的话,或者 end 大于 length,就取用 length
  end = (end === undefined || end > length) ? length : end;

   // 和 start 同样的道理
  if (end < 0) {
    end += length;
  }

  end = start > end ? 0 : end;

  while (start < end) {
    array[start++] = value;
  }
  
  return array;
}

再分享一个函数 toInteger

toInteger

example

 * _.toInteger(3.2);
 * // => 3
 *
 * _.toInteger(Number.MIN_VALUE);
 * // => 0
 *
 * _.toInteger(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toInteger('3.2');
 * // => 3
 */

也就是向下取整,也可以使用 Math.floor, 但是 Math.floor(Infinity) 的返回值是 Infinity

source

toInteger 方法是为了解决小数问题,通过 result % 1 获取小数部分,比如 3 % 1 == 0, 3.1 % 1 == 0.1,然后判断是否有 余数(remainder),使用 原始数据 - 余数 即可获取整数

function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;
  return result === result ? (remainder ? result - remainder : result) : 0;
}

使用 toFinite 把数字进行格式化

var INFINITY = 1 / 0,
    MAX_INTEGER = 1.7976931348623157e+308;
    
function toFinite(value) {
 // 如果 不存在 value 的话,赋值为 0
  if (!value) {
    return value === 0 ? value : 0;
  }
  // 如果 value 是 1 /0 也就是 Infinity 
  // 也可以直接使用 value === Infinity
  if (value === INFINITY || value === -INFINITY) {
    var sign = (value < 0 ? -1 : 1);
    return sign * MAX_INTEGER;
  }
  return value === value ? value : 0;
}

2023/6/25 端午补班