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"
複製代碼
完整的展現ui
/* 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
,具體實現你們本身體會。this
[].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
的實現源碼,感謝你們閱讀!spa