遇見一個題目,如下
var obj = { a: [1, 2, 3], b: [4, 5, 6], c: [7, 8] }; spiltGroup(obj); // [[1,4,7],[2,5,8],[3,6]]
這個相當於是實現一個轉置的功能,但是又還是存在區別的先來看看數組的轉置
var arr1=[ [1,2,3], [4,5,6], [7,8,9] ] var arr2=[ [1,4,7], [2,5,8], [3,6,9] ]
這兩個題目的區別,大家應該看到了,數組的轉置,這個算是很簡單的,應該這個數組,每一行的位數是一樣的,要么是個正方形的數組,要么是個長方形的數組
但是看看第一個題目,每一行的數組的位數,是不一樣的。
先來看看數組的轉置,從思路分析,到底遇到這種問題,該如何去着手
第一步:我們需要創建一個新的數組,這個數組的元素還是數組,我們要知道這個數組,有多少個元素
var arr1=[ [1,2,3], [4,5,6], [7,8,9] ] var arr2 for(var i=0;i<arr[0].length;i++){ arr2[i]=[] } console.log(arr2)// [ [],[],[] ]
因為數組的每一行都是相同的,所以我們直接可以取到arr[0]的長度,即可
第二步:我們循環一次,輸出每一行數組,然后再循環一次,找出數組每一行的東西。行列交換
for (var i = 0; i < arr.length; i++) { for (var j = 0; j < arr[i].length; j++) { arr2[j][i] = arr[i][j]; } }
也是數組的轉置的寫法,蠻新奇的
var arr = [ [2, 4, 6], [8, 9, 0], [9, 6, 2] ]; var newArray = arr[0].map(function(col, i) { return arr.map(function(row) { return row[i]; }) }); console.log(newArray)
這個方法很簡潔,這個具體也說不出來,自己去運行,把每一步打印出來,就知道是什么回事了
再來整整第一個題目,由於他不是嚴格意義上的數組,因此,以上兩種方法是不適合的,我仿照第二種的寫法,最后實現了這功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> var obj = { a: [1, 2, 3], b: [4, 5, 6, 7,8,8], c: [7, 8] }; function spiltGroup(obj) { var arr = [] var arr2 = [] var arr3 = [] for (var key in obj) { arr.push(obj[key]) } arr.forEach(function(item){ arr2.push(item.length) }) var maxLen = Math.max(...arr2) for (var i = 0; i < maxLen; i++) { arr3.push(undefined) } if (arr[0].length < maxLen) { arr[0] = arr[0].concat(arr3).slice(0, maxLen) } var result = arr[0].map(function(col, i) { return arr.map(function(row) { return row[i] }) }); result = result.map(function(item) { return item.filter(function(i) { return i != undefined }) }) return result } var result = spiltGroup(obj) result.forEach(function(i) { console.log(i) }) </script> </body> </html>
總結:最大的感受就是,數組的一些方法,一定要是非常的熟悉,而且,當這些方法的嵌套層次比較深的時候,比如說,先用map,再用filter等等啥的,你要有個清晰的認知,不能混淆