前言
今天讲的是compact()
/concat()
函数。
compact()
创建一个新数组,包含原数组中所有的非假值元素。例如false, null, 0, "", undefined, 和 NaN 都是被认为是“假值”。
我的实现是
function compact(array){
if(!array || !Array.isArray(array) || array.length<=0){
return [];
}
return array.filter(function (value){
if(value) return value;
});
}
我只是调用了es6语法中Array的filter实例方法,实现起来比较简单
lodash的实现是:
function compact(array) {
var index = -1,
length = array == null ? 0 : array.length,
resIndex = 0,
result = [];
while (++index < length) {
var value = array[index];
if (value) {
result[resIndex++] = value;
}
}
return result;
}
它是遍历整个数组,如果元素非假,就加入到result
数组,最后返回result
。
concat()
创建一个新数组,将array与任何数组 或 值连接在一起。
我的实现是
function concat(array){
if(!array || !Array.isArray(array)|| array.length<=0){
return [];
}
if(arguments.length<=1){
return array.concat();
}else{
var args=Array.from(arguments);
var arg= args.splice(1,1);
args[0]=array.concat(arg);
return concat.apply(this,args);
}
}
我是用递归方法,每次通过arguments
得到一个要连接的参数arg
并移除,然后调用array.concat(arg)
生成新的array
,通过concat.apply()
递归调用,直到没有要连接的参数为止。
lodash的实现是:
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];
}
return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}
function arrayPush(array, values) {
var index = -1,
length = values.length,
offset = array.length;
while (++index < length) {
array[offset + index] = values[index];
}
return array;
}
它没有用递归,主要逻辑在最后,先拷贝一份array
,调用arrayPush()
函数,arrayPush()
函数的作用用一个循环,就往array
上一个一个追加values
。
网友评论