使用场景举例:
1.接口返回一个数组对象,展示时每行固定显示n个,则可将返回的数组转成二维数组[[...n], [...n]...]的形式循环展示。
2.轮播图需要每次展示n个,就需要把数据分成若干份,每份n个
方法一:使用slice()方法截取数据
const arr = [1, 2, 3, 4, 5, 6, 7, 8] const len = arr.length //len为数组的长度 const n = 4 // 假设每行显示4个 const Num = len % 4 === 0 ? len / 4 : Math.floor((len / 4) + 1) //得出多少份 const res = [] //定义数组接受最终的数据 for (let i = 0; i < Num; i++) { // slice() 方法返回一个从开始到结束(不包括结束)的数组。且原始数组不会被修改。 const newArr = arr.slice(i * n, i * n + n) //得到每份的数据 res.push(newArr) //往res数组里加数据 } console.log(res, '二维数组')
小结:此方法只适合数组,不适合对象的情况,因为slice()是浅拷贝。导致的问题就是你修改了新生成的数组对象值,会影响原始数组中对象的值。
注意:如果数组里面的数据是对象的话,需要在push的时候,进行深拷贝。
修改代码:使用JSON.parse(JSON.stringify())深拷贝
res.push(JSON.parse(JSON.stringify(temp)));
方法二:双重for循环
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] function getTwoArr (arr, n = 2) { var arr2 = [] for (var i = 0, j = 0; i < arr.length; i += n) { // 初始化数组单个元素为数组 arr2[j] = [] for (var k = 0; k < n; k++) { if (i + k < arr.length) { arr2[j].push(arr[i + k]) } } j++ } console.log(arr2) return arr2 } getTwoArr(arr) getTwoArr(arr, 4)