Fork me on GitHub
秋染蒹葭

JavaScript常见问题之一:数组扁平化(flatten)

数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。

1
2
var arr = [1, [2, [3, 4]]];
console.log(flatten(arr)) // [1, 2, 3, 4]

四种方式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 数组扁平化
/**
* 方法一:reduce()函数法
* 这个方法利用了reduce最终返回一个值的特性
*
* @param arr
*/
const flatten = (arr) =>
// reduce函数,接收一个函数作为累加器,数组中的每个值从低位开始缩减
// 最终返回一个值
// 最终计算为一个值。可以作为一个高阶函数,用于函数的compose
// array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
// total:初始值,必须
// currentValue: 必须当前元素
// currentIndex: 可选,当前元素的索引
// arr: 可选,当前元素所属的数组对象
// initialValue:可选,当前元素所属的数组对象
arr.reduce((a, b) =>
a.concat(Array.isArray(b) ? flatten(b) : b)
, [])
/**
* 方法二:递归的方式,循环,判断是否是嵌套数组
* @param arr
* @returns {Array}
*/
const flatten_recursion = (arr) => {
var result = []
for (var i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten_recursion(arr[i]))
} else {
result.push(arr[i])
}
}
return result
}
/**
* 方法三:利用toString方法,这个方法略残暴,无法区分数字与非数字全变为字符串了
* @param arr
*/
const flatten_toString = (arr) =>
// array的map方法,会返回一个新数组数组中的元素为原始数组调用函数处理后的值
arr.toString().split(',').map(function (item) {
// +号为了变成数字,假如原来的数组里包含数字和字符串就会有问题
return +item
})
/**
* 方法四:利用es6的数组解构
* @param arr
* @returns {*}
*/
const flatten_deconstruction = (arr) => {
// some()方法用来检测数组中的元素是否满足指定条件
// 该方法会依次执行数组中的每个元素,若有一个元素满足条件就返回true,不再执行
// 若没有满足条件的函数就返回false
// 不会改变原始数组
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}
var arr = [1, 2, 3, 4, [1, [1, [32, 3], 23], 2]]
console.log(flatten_deconstruction(arr))

参考资料
【干货】js 数组详细操作方法及解析合集
译文 如何在 JavaScript 中更好地使用数组
Array/Reduce

本文标题:JavaScript常见问题之一:数组扁平化(flatten)

文章作者:zhyjor

发布时间:2018年02月12日 - 10:02

最后更新:2023年10月11日 - 02:10

原始链接:https://zhyjor.github.io/2018/02/12/JavaScript常见问题之一:数组扁平化(flatten)/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

🐶 您的支持将鼓励我继续创作 🐶

热评文章