抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

多维数组降维

一:递归

Array.isArray() 用于确定传递的值是否是一个数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   const oldArr = [1, 2, [3, 4]];
const newArr = []
const getFlat = (arr) =>
{
arr.forEach(element =>
{
if (Array.isArray(element)) {
getFlat(element)
} else {
newArr.push(element)
}
})
}
getFlat(oldArr)
console.log(newArr3) //(4) [1, 2, 3, 4]
  • 递归遍历数组,利用Array.isArray方法判断该元素是否是一个数组
    • 如果当前元素是数组,表示存在嵌套数组的存在,就继续递归该数组进行降维
    • 不是数组,就表示是最外层元素,不需要递归继续降维了,就将其加入到newArr结果数组
  • 在整个遍历过程中,递归调用会一直深入嵌套的数组中,直到最内层的元素全部被添加到newArr数组中

二:reduce方法

2.1 二维降一维

**reduce**(**callback**(accumulator, currentValue, currentIndex, array), initialValue)

  • accumulator : 上一次调用 callbackFn 的结果。在第一次调用时,如果指定了 initialValue 则为指定的值,否则为 array[0] 的值
  • currentValue : 当前元素的值。在第一次调用时,如果指定了 initialValue,则为 array[0] 的值,否则为 array[1]
  • currentIndex : currentValue 在数组中的索引位置。在第一次调用时,如果指定了 initialValue 则为 0,否则为 1
  • array : 调用的数组本身
1
2
3
4
5
6
const oldArr = [1, 2, [3, 4]];
const newArr = oldArr.reduce((prev, curr) =>
{
return prev.concat(curr)
}, [])
console.log(newArr); //(4) [1, 2, 3, 4]
  • 第一个参数prev作为累计值为回调函数的返回值,或是初始值
  • 第二个参数curr作为当前值,即当前迭代的元素
  • reduce()方法以递归的方式遍历多维数组的每个元素,并将它们合并到累积值中

2.2 多维降一维

reduce递归

1
2
3
4
5
6
7
8
9
10
11
12
13
const getFlat1 = (arr) =>
{
return arr.reduce((prev, curr) =>
{
if (Array.isArray(curr)) {
return prev.concat(getFlat1(curr))
} else {
return prev.concat(curr)
}
}, [])
}
const newArr4 = getFlat1(oldArr)
console.log(newArr4); //(4) [1, 2, 3, 4]
  • 还是使用reduce方法迭代数组
  • 判断curr迭代的当前元素是否是Array数组,如果是就递归调用进行降维,并使用concat方法与累加器prev合并
  • 如果不是数组,就直接合并

三:flat方法

es6方法,flat(),用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

  • 参数可以设置拉平的层数,不设置参数默认为1
  • 如果不管有多少层的嵌套,都要转为一维数组,可以用Infinity关键字作为参数
  • 如果原数组中有空位的话,会直接跳过空元素,直接合并到一起
1
2
3
const oldArr = [1, 2, , [3, 4]];
const newArr5 = oldArr.flat()
console.log(newArr5); //[1, 2, 3, 4]

评论