lodash.concat()
大家好-我是灵魂画师-茄子。水平一般,喜欢画画。
最近开始看有关lodash的源码了 争取每天一篇有关lodash的方法的解释
_.concat(array, [values])
创建一个新数组,将array与任何数组 或 值连接在一起。
* @since 4.0.0
* @category Array
* @param {Array} array The array to concatenate.
* @param {...*} [values] The values to concatenate.
* @returns {Array} Returns the new concatenated array.
相关代码:
function concat() {
// 因为不知道一共有多少个 参数 取arguments的长度即可得知参数个数
var length = arguments.length;
// 针对于传参数为空 的话 直接返回一个 空数组
if (!length) {
return [];
}
var args = Array(length - 1), // 创建 一个跟参数长度相同的数组
array = arguments[0],
index = length;
while (index--) {
// index每减1 就让args[]对应位置等于arguments的对应位置
args[index - 1] = arguments[index];
}
// 返回一个将第一位array与剩下的 被拍平的数组合并(baseFlatten 就做了这么 一件事,将args中的每一项都拍平了一个层级(个人理解 [[4]] -> [4] ))
// 判断第一个参数是否是array 如果是的话拷贝他,如果不是的话[array]转数组
return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}
function arrayPush(array, values) {
var index = -1,
offset = array.length,
length = values.length;
// 思路:将俩个array合并 分别获取array、values的长度 将values的每一项放到array数组的末尾
while (++index < length) {
array[offset + index] = values[index];
}
return array;// 返回合并后的数组
}
function baseFlatten(array, depth, predicate, isStrict, result) {
var index = -1,
length = array.length;
predicate || (predicate = isFlattenable); // 判断有没有predicate 没有的话就是isFlattenable(关于这个东西我暂时还不是很懂,有懂的可以评论区告诉我!!)
result || (result = []);
while (++index < length) {
var value = array[index];
// depth的深度
// depth应该是需要拍平几层 1就是需要拍平1层 2就是2层
// predicate 这个方法判断了这一项是否是需要拍平的
if (depth > 0 && predicate(value)) {
if (depth > 1) {
console.log('执行这里')
// concat这个方法不会进去这里
// 这里是递归调用拍平数组使用的
// Recursively flatten arrays (susceptible to call stack limits).
baseFlatten(value, depth - 1, predicate, isStrict, result);
} else {
// 将拍平的数组放到新数组后面
arrayPush(result, value);
}
} else if (!isStrict) {
// concat这个方法不会进去这里 暂时也没想到这个方法有什么用
result[result.length] = value;
}
}
return result;
}
function copyArray(source, array) {
// 复制一个数组出来
var index = -1,
length = source.length;
array || (array = Array(length));
while (++index < length) {
array[index] = source[index];
}
return array;
}
大致思路:
- 获取所有的arguments
- 提取第一个arguments
- 将除第一个arguments,组成一个新的数组
- 把第一个arguments 与 被拍平一层的新组成的数组合并
- 返回新数组
我也有很多不懂的地方,欢迎大家一起来讨论与技术有关的一些想法~~~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。