数组降维顾名思义就是把数组从高维降低到低维,类似地,我们可以把数据从原本的p维转变为一系列k维的子集(k<<n),这就是降维。
以下是在数据集中应用降维的用处:
数组降维主要有以下3种方式:
我们先来个简单的:
二维数组如何降级成一维数组?
很多时候,我们的数组层次并没有那么深,只有个二维数组,所以我们可以了解下一些快捷的使用方法。
reduce() 二维降一维:
const oldArr = [1, 2, [3, 4]];
const newArr = oldArr.reduce((prev, curr) => (prev.concat(curr)), []);
console.log(newArr);
// [1, 2, 3, 4]
concat() 二维将一维
const oldArr = [1, 2, [3, 4]];
const newArr = [].concat(...oldArr);
const newnewArr = Array.prototype.concat.apply([], oldArr);
console.log(newArr);
// [1, 2, 3, 4]
console.log(newnewArr);
// [1, 2, 3, 4]
flat() 二维降一维
const oldArr = [1, 2, [3, 4]];
const newArr = oldArr.flat();
console.log(newArr);
// [1, 2, 3, 4]
既然二维降一维的小伙伴们看过之后,我们就可以进一步了解多维降一维数组了。
我们先了解下通过递归降维。
关于递归降维,这里有两个方法:
下面一一分析:
forEach 递归降维
const oldArr = [
1,
[
2, [3],
[4, 5, 6],
[7, 8, 9],
10,
11,
],
12,
13,
14,
[15, 16, 17],
];
const newArr = [];
const ergodic = (arr) => {
arr.forEach((item) => {
if (Array.isArray(item)) {
ergodic(item);
} else {
newArr.push(item);
}
})
}
ergodic(oldArr, newArr);
console.log(newArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
Array.isArray() 用于确定传递的值是否是一个 Array,返回 true 或者 false。
在这个递归方法中,我们判断每一项是不是数组。
如果是,则进一步递归,直到其不是为止。
如果不是,则用新数组接收它。
reduce 递归降维
const oldArr = [
1,
[
2, [3],
[4, 5, 6],
[7, 8, 9],
10,
11
],
12,
13,
14,
[15, 16, 17],
];
const ergodic = (arr) => arr.reduce((prev, curr, index, list) => {
if (Array.isArray(curr)) {
return prev.concat(...ergodic(curr));
}
return prev.concat(curr);
}, []);
const newArr = ergodic(oldArr);
console.log(newArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
flat() 是 ES6 提供的一个将嵌套的数组 “拉平” 的方法。
flat 降维
const oldArr = [
1,
[
2, [3],
[4, 5, 6],
[7, 8, 9],
10,
11
],
12,
13,
14,
[15, 16, 17],
];
const newArr = oldArr.flat(Infinity);
console.log(newArr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ]
关于 flat(),这里大致讲下这个方法:
arr.flat(depth)。
这个 depth 即拉平几层的意思,就好比:
// 二维数组:默认拉平一层
[1, 2, [3, 4, [5]]].flat();
// [1, 2, 3, 4, [5]]
// 四维数组:设置拉平两层
[1, 2, [3, 4, [5, [6, 7]]]].flat(2);
// [1, 2, 3, 4, 5, [6, 7]]
// 设置拉平所有层
[1, 2, [3, 4, [5]]].flat(Infinity);
// [1, 2, 3, 4, 5]
值得注意的是:使用 flat() 拉平数组过程中,会移除数组的空项:
这里不一一介绍,感兴趣的可以了解下。
flatMap() 使用
const arr = [1, 2, 3, 4];
arr.flatMap(x => x * 2);
// [2, 4, 6, 8]
arr.flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54