每一步都是曼妙的风景~
使用:
减少一级array嵌套深度
使用示例:
_.flatten([1, [2, [3, [4]], 5]]);
// => [1, 2, [3, [4]], 5]
①修改原数组;②数组减少一级嵌套深度;③ 合并能力,可以减少n层嵌套深度
let flatten_arr=[1, [2,[3 ,[4]],5]];
function my_flatten(arr) {
if(arr.length === 0) { return arr };
if(arr instanceof Array) {
let newArr = [];
for(let i = 0; i< arr.length; i++) {
if(arr[i] instanceof Array) {
for(var j = 0; j < arr[i].length; j++) {
newArr.push(arr[i][j])
}
}else{
newArr.push(arr[i])
}
}
arr = newArr
}
return arr;
}
console.log(my_flatten(flatten_arr)); // [1,2,[3,[4]],5]
function flatten(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, 1) : [];
}
function baseFlatten(array, depth, predicate, isStrict, result) {
var index = -1,
length = array.length;
predicate || (predicate = isFlattenable);
result || (result = []);
while (++index < length) {
var value = array[index];
if (depth > 0 && predicate(value)) {
if (depth > 1) {
// 如果是多层级或直接拍平,递归调用自身即可完成
baseFlatten(value, depth - 1, predicate, isStrict, result);
} else {
arrayPush(result, value);
}
} else if (!isStrict) {
result[result.length] = value;
}
}
return result;
}
将array递归为一维数组。
使用示例:
_.flattenDeep([1, [2, [3, [4]], 5]]);
// => [1, 2, 3, 4, 5]
源码方案:
function flattenDeep(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, INFINITY) : [];
}
根据 depth 递归减少 array 的嵌套层级
使用示例:
var array = [1, [2, [3, [4]], 5]];
_.flattenDepth(array, 1);
// => [1, 2, [3, [4]], 5]
_.flattenDepth(array, 2);
// => [1, 2, 3, [4], 5]
源码方案:
function flattenDepth(array, depth) {
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
depth = depth === undefined ? 1 : toInteger(depth);
return baseFlatten(array, depth);
}
总的来说还是循环+递归调用的方式,实现深层拍平。取值然后push到新数组即可。