JavaScript 練習 陣列長度轉換

有個二維陣列資料如下:
    
let input = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
    

每個長度為 3,需要轉換長度為 2 和 4,並且如果長度不足,則捨棄該筆資料。
範例輸出:
    
let ans2 = [[1, 2], [3, 4], [5, 6], [7, 8]];
let ans4 = [[1, 2, 3, 4], [5, 6, 7, 8]];
    

硬解:

假設在腦袋一片空白,什麼內建函式都想不到的情況下,就算用最爛的方式也要想辦法解出來。雖然可能很慢很粗糙,但是至少你沒有放棄,至少寫得出來,畢竟如果什麼程式碼都沒寫,在考官心裡的分數很可能就是負的,可能也不會讓你寫下一題。
    
let input = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

let list = [];
for (let i = 0; i < input.length; i++) {
    for (let j = 0; j < input[i].length; j++) {
        list.push(input[i][j]);
    }
}
console.log(list); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

let ans = [];
for (let i = 0; i < list.length; i++) {
    if (i % 2 === 0) {
        ans.push([list[i]]);
    } else {
        ans[ans.length - 1].push(list[i]);
    }
}
if (ans[ans.length - 1].length < 2) {
    ans.pop();
}
console.log(ans); // [[1, 2], [3, 4], [5, 6], [7, 8]]
    

想辦法寫完之後,再慢慢想可以調整的部分。例如要將二維陣列拆開來的方式有很多種,這裡先示範使用三個點的語法糖將陣列拆開,再自訂函式方便複用,避免 2 個的和 4 個的都要寫一次

解法:
    
let input = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];

let list = [];
input.forEach(item => list.push(...item));
console.log(list); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

function to2DArray(array, rowSize) {
    let ans = [];
    for (let i = 0; i < array.length; i += rowSize) {
        const tempList = array.slice(i, i + rowSize);
        if (tempList.length === rowSize) ans.push(tempList);
    }
    return ans;
}

console.log(to2DArray(list, 2)); // [[1, 2], [3, 4], [5, 6], [7, 8]]
console.log(to2DArray(list, 4)); // [[1, 2, 3, 4], [5, 6, 7, 8]]
    

另外要展平二維陣列也可以使用下面的方式一行解決:
    
let input = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
let list = input.reduce((array, val) => array.concat(val), []);
console.log("list", list); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
    



參考資料:
完整 JavaScript 陣列 Array 詳細教學和範例

留言