数组扁平化 js实现
flat函数
Array.prototype.flat(参数)方法 该方法不会改变原数组,会返回一个新数组
语法:var newArray = arr.flat([depth])
说明:
depth为指定要提取嵌套数组的结构深度,默认值为1。
参数depth值 <=0 时返回原数组;
参数depth为Infinity 关键字时,无论多少层嵌套,都会转为一维数组,
flat()方法会移除数组中的空项,即原数组有空位,会跳过这个空位。
var arr1=[1,2,[2,3],[[4,5]],6]
var arr2=[2,5,5]
console.log(arr1.flat(Infinity))
console.log(arr2.flat(Infinity))
console.log(arr1)
// [1, 2, 2, 3, 4, 5, 6]
// [2, 5, 5]
// [1, 2, Array(2), Array(1), 6]
其他方案
遍历数组方案
for循环
for…of
for…in
entries()
keys()
values()
forEach()
map()
reduce()
判断数组元素是否为数组
instanceof
constructor
Object.prototype.toString
isArray
数组元素展开一层方案
扩展运算符 + concat — [].concat(…arr)
concat +apply — [].concat.apply([], arr) / Array,prototype.concat.apply([],arr)
toString + split 不推荐
递归实现
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
}
else {
result.push(arr[i])
}
}
return result;
}
console.log(flatten(arr))
[].concat(…arr)展开一层
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
console.log(flatten(arr))
reduce
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.reduce(function(prev, next){
return prev.concat(Array.isArray(next) ? flatten(next) : next)
}, [])
}
console.log(flatten(arr))
// 传参控制层数
function flat(arr, num = 1) {
return num > 0
? arr.reduce(
(pre, cur) =>
pre.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur),
[]
)
: arr.slice();
}
const arr = [1, 2, 3, 4, [1, 2, 3, [1, 2, 3, [1, 2, 3]]], 5, "string", { name: "弹铁蛋同学" }]
flat(arr, Infinity);
使用字符串方法
// toString+split
var arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.toString().split(',').map(function(item){
return +item
})
}
console.log(flatten(arr))
// 使用数组方法join和字符串方法split进行数组扁平化
let arr1 = [4, 1, 2, 3, 6, [7, 8, [3, 9, 10, [4, 6, 11]]]];
let res1 = arr1.join(",").split(",").map(Number);
// join(',')-扁平化的字符串,split(',')-字符串数组,map(Number)-Number数组
console.log(res1);
//通过正则方法和JSON.stringify()方法和数组方法
let res = JSON.stringify(arr1).replace(/\[|\]/g, "").split(",").map(Number);
console.log(res);
栈
// 栈思想
function flat(arr) {
const result = [];
const stack = [].concat(arr); // 将数组元素拷贝至栈,直接赋值会改变原数组
//如果栈不为空,则循环遍历
while (stack.length !== 0) {
const val = stack.pop();
if (Array.isArray(val)) {
stack.push(...val); //如果是数组再次入栈,并且展开了一层
} else {
result.unshift(val); //如果不是数组就将其取出来放入结果数组中
}
}
return result;
}