lodash源码分析每日一练 - 数组 - fill

今日分享:

每一步都是曼妙的风景~

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

使用:
使用 value 值来填充(替换) array,从start位置开始, 到end位置结束(但不包含end位置)。

使用示例:

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

尝试手写:

①改变原数组;②替换原有元素;③可以指定开始和结束位置

    let fill_arr = [1,2,3];
    function my_fill (arr, value, start = 0, end = arr.length){
        if(arr.length != 0) {
            for(let i = start ; i < end; i++) {
                arr[i] = value
            }
        }
    }
    my_fill(fill_arr,'*');
    console.log(fill_arr); // ['*','*','*']

源码方案:

function fill(array, value, start, end) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
    start = 0;
    end = length;
  }
  return baseFill(array, value, start, end);
}
// 核心源码
function baseFill(array, value, start, end) {
  var length = array.length;
  // 起始位置为负时,从后往前计数
  start = toInteger(start);
  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  end = (end === undefined || end > length) ? length : toInteger(end);
  if (end < 0) {
    end += length;
  }
  end = start > end ? 0 : toLength(end);
  while (start < end) {
    array[start++] = value;
  }
  return array;
}

备注

领导说,约定俗成的规则不在代码里排除都是空谈,因为你无法保证对方给你的参数就一定是你需要的那种,如果因此造成阻塞,那这属于低级错误里的低级错误,所以一定要做好参数不符合时的排错,可以不出内容,但是不能阻塞运行。lodash对这方面永远有相对来说更全面的方案。

你可能感兴趣的:(lodash每日一源,javascript,前端,开发语言)