模拟js字符串类型的slice函数实现数组类型的slice,即将“array”从“start”索引切片到(但不包括)“end”索引。
_
示例
var slice = require('array-slice');
var arr = ['a', 'b', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
slice(arr, 3, 6);
//=> ['e', 'f', 'g']
代码
'use strict';
module.exports = function slice(arr, start, end) {
var len = arr.length;
var range = [];
start = idx(len, start);
end = idx(len, end, len);
while (start < end) {
range.push(arr[start++]);
}
return range;
};
function idx(len, pos, end) {
if (pos == null) {
pos = end || 0;
} else if (pos < 0) {
pos = Math.max(len + pos, 0);
} else {
pos = Math.min(pos, len);
}
return pos;
}
解析
- 此函数的核心函数接收三个参数,分别是数组、开始索引和结束索引。
- 刚开始计算了数组长度和初始化了存储结果的range数组变量。
- 随后遇到了令人费解的idx函数,它的作用是将此函数的索引能够像String.slice的索引一样灵活。
- 它接收三个参数,分别是数组长度、定位索引和结束索引,可用来计算最终的“循环序号”。
- 这个“循环序号”决定着最终要把原始数组中的哪些值push到range结果中。
- 关于返回值
- 三种if情况
- 如果定位索引没有填,则结果为结束索引;如果结束索引也没有填,那默认返回0。
- 定位索引允许为负数,但是跟长度相加后,最终不能小于0。
- 一般情况定位索引都是正整数,但它的大小是受限的,不能大于数组长度。
- 因此返回值为0到len之间到数值。
- 三种if情况
- 它接收三个参数,分别是数组长度、定位索引和结束索引,可用来计算最终的“循环序号”。
- 通过idx函数获得了最终到开始索引start和结束索引end后,用while循环将开始索引 start++ 到等于end(不包含)为止把结果push到range数组中,最终返回出来。