今日分享:
每一步都是曼妙的风景~
_.concat(array, [values])
使用:
创建一个新数组,array和任何数组或值连接在一起。
使用示例:
var array = [1];
var other = _.concat(array, 2, [3], [[4]]);
console.log(other);
// => [1, 2, 3, [4]]
console.log(array);
// => [1]
尝试手写:
①返回新数组;②拼接;③如果参数最外层是个数组,只合并一层数组,不平铺全部层级。
let array = [1];
function my_concat(...args){
let array = [];
for(var i = 0; i < args.length; i++) {
if(args[i] instanceof Array) {
for(var j = 0; j < args[i].length; j++){
array.push(args[i][j])
}
}else{
array.push(args[i])
}
}
return array;
}
console.log(my_concat(array,2,[3],[[4]]));//[1,2,3,[4]]
源码方案:
function arrayPush(array, values) {
var index = -1,
length = values.length,
offset = array.length;
while (++index < length) {
array[offset + index] = values[index];
}
return array;
}
function concat() {
var length = arguments.length;
// 判断非空
if (!length) {
return [];
}
var args = Array(length - 1),
array = arguments[0],
index = length;
// 声明一个相同长度的空数组,循环替换数组内容,即我理解的第一层循环做的工作
while (index--) {
args[index - 1] = arguments[index];
}
// arrayPush:第一个参数值为第一个数组array,第二个参数值是循环替换后的总数据,
// baseFlatten是一个循环解构的函数,第一个参数是数组,第二个参数是解构几层,
// copyArray复制数组,不修改原数组的一种
return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}
理解
lodash各个方法之间穿插调用,它本身是个工具函数,自己内部又定义了更多的工具函数,稍微有点理解“函数式编程”的思想。将能拆出去的工具函数都拆分开,以得到足够的复用。