用js实现数组的转置
遇见一个题目,如下
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等等啥的,你要有个清晰的认知,不能混淆