Ps: flatten
可使数组扁平化,效果就会以下:数组
const arr = [1, [2, [3, 4]]]; console.log(flatten(arr)); // [1, 2, 3, 4]
从中能够看出,使用
flatten
处理后的数组只有一层,下面咱们来试着实现一下。app
/* 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));
toString()
toString
把数组变成以逗号分隔的字符串,而后遍历数组把每一项再变回原来的类型。先来看下 toString
是怎么把数组变成字符串的函数
[1, [2, 3, [4]]].toString() // "1,2,3,4"
完整的展现this
/* 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
,具体实现你们本身体会。spa
[].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));
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));
...
...
每次只能展开最外层的数组,被 [].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
的实现源码,感谢你们阅读!prototype