模拟js字符串类型的slice函数实现数组类型的slice,即将“array”从“start”索引切片到(但不包括)“end”索引。
_

示例

  1. var slice = require('array-slice');
  2. var arr = ['a', 'b', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
  3. slice(arr, 3, 6);
  4. //=> ['e', 'f', 'g']

代码

  1. 'use strict';
  2. module.exports = function slice(arr, start, end) {
  3. var len = arr.length;
  4. var range = [];
  5. start = idx(len, start);
  6. end = idx(len, end, len);
  7. while (start < end) {
  8. range.push(arr[start++]);
  9. }
  10. return range;
  11. };
  12. function idx(len, pos, end) {
  13. if (pos == null) {
  14. pos = end || 0;
  15. } else if (pos < 0) {
  16. pos = Math.max(len + pos, 0);
  17. } else {
  18. pos = Math.min(pos, len);
  19. }
  20. return pos;
  21. }

github仓库:https://github.com/jonschlinkert/array-slice

解析

  • 此函数的核心函数接收三个参数,分别是数组、开始索引和结束索引。
  • 刚开始计算了数组长度和初始化了存储结果的range数组变量。
  • 随后遇到了令人费解的idx函数,它的作用是将此函数的索引能够像String.slice的索引一样灵活。
    • 它接收三个参数,分别是数组长度、定位索引和结束索引,可用来计算最终的“循环序号”
      • 这个“循环序号”决定着最终要把原始数组中的哪些值push到range结果中。
    • 关于返回值
      • 三种if情况
        • 如果定位索引没有填,则结果为结束索引;如果结束索引也没有填,那默认返回0。
        • 定位索引允许为负数,但是跟长度相加后,最终不能小于0。
        • 一般情况定位索引都是正整数,但它的大小是受限的,不能大于数组长度。
      • 因此返回值为0到len之间到数值。
  • 通过idx函数获得了最终到开始索引start和结束索引end后,用while循环将开始索引 start++ 到等于end(不包含)为止把结果push到range数组中,最终返回出来。