数组扁平化
Array.prototype.flat() 是用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。
const animals = ["🐷", ["🐶", "🐂"], ["🐎", ["🐑", ["🐲"]], "🐛"]];
// 不传参数时,默认“拉平”一层
animals.flat();
// ["🐷", "🐶", "🐂", "🐎", ["🐑", ["🐲"]], "🐛"]
// 传入一个整数参数,整数即“拉平”的层数
animals.flat(2);
// ["🐷", "🐶", "🐂", "🐎", "🐑", ["🐲"], "🐛"]
// Infinity 关键字作为参数时,无论多少层嵌套,都会转为一维数组
animals.flat(Infinity);
// ["🐷", "🐶", "🐂", "🐎", "🐑", "🐲", "🐛"]
// 传入 <=0 的整数将返回原数组,不“拉平”
animals.flat(0);
animals.flat(-10);
// ["🐷", ["🐶", "🐂"], ["🐎", ["🐑", ["🐲"]], "🐛"]];
// 如果原数组有空位,flat()方法会跳过空位。
["🐷", "🐶", "🐂", "🐎",,].flat();
// ["🐷", "🐶", "🐂", "🐎"]
下面手写实现 flat
// 1.数组 flat 方法的简单实现
const animals = ["🐷", ["🐶", "🐂"], ["🐎", [["🐲"], "🐑"], "🐛"]];
/* function flat(target, newArr = []) {
for (let i = 0; i < target.length; i++) {
if (Array.isArray(target[i])) {
flat(target[i], newArr);
} else {
newArr.push(target[i]);
}
}
return newArr;
}
function flat1(arr) {
let arrResult = [];
arr.forEach(item => {
if (Array.isArray(item)) {
arrResult = arrResult.concat(arguments.callee(item)); // 递归
// 或者用扩展运算符
// arrResult.push(...arguments.callee(item));
} else {
arrResult.push(item);
}
});
return arrResult;
} */
// 2.用 reduce 实现 flat
/* function flat(arr) {
return arr.reduce((acc, cur) => acc.concat(Array.isArray(cur) ? flat(cur) : cur), [])
}
console.log(flat(animals)); */
// 3. 用栈的思想实现 flat
/* function flat(arr) {
let result = [];
let stack = [].concat(arr); // 不直接赋值,不然修改 stack 会修改原数组
//如果栈不为空,则循环遍历
while (stack.length !== 0) {
let val = stack.pop();
if (Array.isArray(val)) {
stack.push(...val); //如果是数组再次入栈,并且展开了一层
} else {
result.unshift(val); //如果不是数组就将其取出来放入结果数组中
}
}
return result;
}
console.log(flat(animals)); */
// 4. 传入一个整数来控制“拉平”的层数
/* function flat(arr, num = 1) {
return num > 0 ?
arr.reduce((acc, cur) => {
return acc.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur)
}, [])
:
arr // [].aconcat(arr) / arr.slice()
}
console.log(flat(animals, Infinity)); */
// 5. 使用 Generator 实现 flat 函数
function* flat(arr, num = 1) {
for (const item of arr) {
if (Array.isArray(item) && num > 0) {
yield* flat(item, num - 1);
} else {
yield item;
}
}
}
console.log([...flat(animals, Infinity)]);
posted on
浙公网安备 33010602011771号