let arr = [1,[2, [3], [4, 5, 6], [7, 8, 9], 10, 11], 12, 13, 14, [15, 16, 17]]
複製代碼
方法一:遞歸數組
function recursive(arr, newArr) {
arr.forEach(item => {
Array.isArray(item) ? recursive(item, newArr) : newArr.push(item)
})
}
let newArr = [];
recursive(arr, newArr)
複製代碼
結果:bash
方法二:reduceapp
let flattenDeep = (arr) => arr.reduce((start, current) => (
Array.isArray(current) ?
start.concat(...flattenDeep(current)) :
start.concat(current)
), [])
let newArr2 = flattenDeep(arr);
複製代碼
結果:函數
方法三:flatui
let newArr3 = arr.flat(Infinity);
複製代碼
let arr = [[1,2,3], [4,5,6], 7,8,9];
複製代碼
方法一:reducespa
let newArr = arr.reduce((start, current) => (start.concat(current)), [])
複製代碼
方法二:concatcode
let newArr1 = [].concat(...arr)
複製代碼
方法三:concat + applycdn
let newArr2 = [].concat.apply([], arr)
複製代碼
結果:blog
let arr = [1,2,3,4,5,6,7,8,9,0];
複製代碼
方法:遞歸
let group = (arr, length) => {
let index = 0;
let newArr = [];
while (index < arr.length) {
newArr.push(arr.slice(index, index += length))
}
return newArr;
}
複製代碼
結果:
reduce是一個功能很強大的函數,因爲平時不怎麼使用因此這裏寫一下做爲備忘。
語法
arr.reduce(callback[, initialValue])
callback有四個參數
initialValue,做爲第一次調用 callback函數時的第一個參數的值。
用法
reduce會爲數組中的每個元素都執行一邊callback,若是傳入了initialValue那麼第一次執行callback中的Accumulator就是initialValue的值,callback中的Current Index就是0,若是不傳,第一次執行callback中的Accumulator就是數組中的第一個元素,Current Index就是1
例子:
// 算出1+2+3+...+100的值
let source = Array.from({length: 100}, (v, i) => i+1);
let result = source.reduce((acc, cur) => acc + cur);
複製代碼
最開始這種我都是用遞歸去算,使用reduce就顯得很簡單了。簡單的說下計算過程
let arr = [1,2,3,4]
let res = arr.reduce((acc, cur) => acc + cur);
// reduce的計算過程就像下面這樣
((1+2)+3)+4
/*
就是第一次callback的執行結果,會做爲第二次callback的acc參數傳入。
若是傳入了initialValue值那麼計算過程就是這樣
*/
let res1 = arr.reduce((acc, cur) => acc + cur, 100);
(((100+1)+2)+3)+4
複製代碼