一、什么是数组扁平化
- 扁平化,望文生义就是削减庞杂性装潢,使其事物自身更简约、简朴,突出主题。
- 数组扁平化,对着上面意义套也知道了,就是将一个庞杂的嵌套多层的数组,一层一层的转化为层级较少或许只要一层的数组。
Ps: flatten
能够使数组扁平化,结果就会以下:
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr)); // [1, 2, 3, 4]
从中能够看出,运用
flatten
处置惩罚后的数组只要一层,下面我们来试着完成一下。
二、简朴完成
2.1 一般递归
- 这是最轻易想到的要领,简朴,清楚!
/* ES6 */
const flatten = (arr) => {
let result = [];
arr.forEach((item, i, arr) => {
if (Array.isArray(item)) {
result = result.concat(flatten(item));
} else {
result.push(arr[i])
}
})
return result;
};
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
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;
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
2.2 toString()
- 该要领是应用
toString
把数组变成以逗号分开的字符串,然后遍历数组把每一项再变回本来的范例。
先来看下 toString
是怎样把数组变成字符串的
[1, [2, 3, [4]]].toString()
// "1,2,3,4"
完全的展现
/* ES6 */
const flatten = (arr) => arr.toString().split(',').map((item) => +item);
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
function flatten(arr) {
return arr.toString().split(',').map(function(item){
return +item;
});
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
这类要领运用的场景却异常有限,必需数组中元素悉数都是
Number
。也能够悉数都为
String
,详细完成人人本身体味。
2.3 [].concat.apply
+ some
- 应用
arr.some
推断当数组中另有数组的话,轮回挪用flatten
扁平函数(应用[].concat.apply
扁平), 用concat
衔接,终究返回arr
;
/* ES6 */
const flatten = (arr) => {
while (arr.some(item => Array.isArray(item))){
arr = [].concat.apply([], arr);
}
return arr;
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
/* ES5 */
/**
* 封装Array.some
* @param {function} callback - 回调函数
* @param {any} currentThis - 回调函数中this指向
*/
Array.prototype.some = function (callback, currentThis){
let context = this;
let flag = false;
currentThis = currentThis || this;
for (var i = 0, len = context.length; i < len; i++) {
const res = callback.call(currentThis, context[i], i, context);
if (res) {
flag = true;
} else if (!flag) {
flag = false;
}
}
return flag;
}
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat.apply([], arr);
}
return arr;
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
2.4 reduce
-
reduce
自身就是一个迭代轮回器,一般用于累加,所以依据这一特性有以下:
function flatten(arr){
return arr.reduce(function(prev, cur){
return prev.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, [])
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
2.5 ES6 中的 解构运算符 ...
-
...
每次只能睁开最外层的数组,被[].concat
后,arr
就扁平化一次。
function flatten(arr){
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr);
}
return arr;
}
const arr = [1, [2, [3, 4]]];
console.log(flatten(arr));
番外篇将给人人解说 lodash
中 flatten
的完成源码,谢谢人人浏览!